avidemux: small cleanups

This commit is contained in:
Wim Taymans 2009-09-22 12:35:30 +02:00 committed by Wim Taymans
parent b4a490655a
commit 0d70fe30a8
2 changed files with 30 additions and 24 deletions

View file

@ -52,6 +52,9 @@
#include <gst/gst-i18n-plugin.h>
#include <gst/base/gstadapter.h>
#define DIV_ROUND_UP(s,v) ((s) + ((v)-1) / (v))
GST_DEBUG_CATEGORY_STATIC (avidemux_debug);
#define GST_CAT_DEFAULT avidemux_debug
GST_DEBUG_CATEGORY_STATIC (GST_CAT_PERFORMANCE);
@ -1874,14 +1877,14 @@ gst_avi_demux_index_last (GstAviDemux * avi, GstAviStream * stream)
/* find a previous entry in the index with the given flags */
static guint
gst_avi_demux_index_prev (GstAviDemux * avi, GstAviStream * stream,
guint last, guint32 flags)
guint last, gboolean keyframe)
{
GstAviIndexEntry *entry;
guint i;
for (i = last; i > 0; i--) {
entry = &stream->index[i - 1];
if ((entry->flags & flags) == flags) {
if (!keyframe || ENTRY_IS_KEYFRAME (entry)) {
return i;
}
}
@ -1890,14 +1893,14 @@ gst_avi_demux_index_prev (GstAviDemux * avi, GstAviStream * stream,
static guint
gst_avi_demux_index_next (GstAviDemux * avi, GstAviStream * stream,
guint last, guint32 flags)
guint last, gboolean keyframe)
{
GstAviIndexEntry *entry;
gint i;
for (i = last + 1; i < stream->idx_n; i++) {
entry = &stream->index[i];
if ((entry->flags & flags) == flags) {
if (!keyframe || ENTRY_IS_KEYFRAME (entry)) {
return i;
}
}
@ -2020,7 +2023,7 @@ gst_avi_demux_get_entry_info (GstAviDemux * avi, GstAviStream * stream,
if (size)
*size = entry->size;
if (keyframe)
*keyframe = (entry->flags & GST_AVI_INDEX_ENTRY_FLAG_KEYFRAME) != 0;
*keyframe = ENTRY_IS_KEYFRAME (entry);
}
@ -2101,15 +2104,17 @@ gst_avi_demux_parse_index (GstAviDemux * avi, GstBuffer * buf)
/* handle flags */
if (stream->strh->type == GST_RIFF_FCC_auds) {
/* all audio frames are keyframes */
entry.flags = GST_AVI_INDEX_ENTRY_FLAG_KEYFRAME;
ENTRY_SET_KEYFRAME (&entry);
stream->n_keyframes++;
} else {
entry.flags = GST_READ_UINT32_LE (&index[i].flags);
if (entry.flags & GST_RIFF_IF_KEYFRAME) {
entry.flags = GST_AVI_INDEX_ENTRY_FLAG_KEYFRAME;
guint32 flags;
/* else read flags */
flags = GST_READ_UINT32_LE (&index[i].flags);
if (flags & GST_RIFF_IF_KEYFRAME) {
ENTRY_SET_KEYFRAME (&entry);
stream->n_keyframes++;
} else {
entry.flags = 0;
ENTRY_UNSET_KEYFRAME (&entry);
}
}
@ -2120,10 +2125,9 @@ gst_avi_demux_parse_index (GstAviDemux * avi, GstBuffer * buf)
entry.total = stream->total_bytes;
stream->total_bytes += entry.size;
if (stream->strh->type == GST_RIFF_FCC_auds) {
if (stream->strf.auds->blockalign > 0)
stream->total_blocks +=
(entry.size + stream->strf.auds->blockalign -
1) / stream->strf.auds->blockalign;
gint blockalign = stream->strf.auds->blockalign;
if (blockalign > 0)
stream->total_blocks += DIV_ROUND_UP (entry.size, blockalign);
else
stream->total_blocks++;
}
@ -2148,9 +2152,10 @@ gst_avi_demux_parse_index (GstAviDemux * avi, GstBuffer * buf)
}
GST_LOG_OBJECT (avi,
"Adding stream %d, index entry %d, flags %02x, size %u "
"Adding stream %d, index entry %d, kf %d, size %u "
", offset %" G_GUINT64_FORMAT ", total %" G_GUINT64_FORMAT, stream_nr,
stream->idx_n, entry.flags, entry.size, entry.offset, entry.total);
stream->idx_n, ENTRY_IS_KEYFRAME (&entry), entry.size, entry.offset,
entry.total);
/* and copy */
stream->index[stream->idx_n++] = entry;
@ -3861,8 +3866,7 @@ gst_avi_demux_move_stream (GstAviDemux * avi, GstAviStream * stream,
* to the next keyframe. If there is a smart decoder downstream he will notice
* that there are too many encoded frames send and return UNEXPECTED when there
* are enough decoded frames to fill the segment. */
next_key = gst_avi_demux_index_next (avi, stream, index,
GST_AVI_INDEX_ENTRY_FLAG_KEYFRAME);
next_key = gst_avi_demux_index_next (avi, stream, index, TRUE);
stream->start_entry = 0;
stream->step_entry = index;
@ -3916,8 +3920,7 @@ gst_avi_demux_do_seek (GstAviDemux * avi, GstSegment * segment)
GST_DEBUG_OBJECT (avi, "not keyframe, searching back");
/* now go to the previous keyframe, this is where we should start
* decoding from. */
index = gst_avi_demux_index_prev (avi, stream, index,
GST_AVI_INDEX_ENTRY_FLAG_KEYFRAME);
index = gst_avi_demux_index_prev (avi, stream, index, TRUE);
GST_DEBUG_OBJECT (avi, "previous keyframe at %u", index);
}
@ -3953,8 +3956,7 @@ gst_avi_demux_do_seek (GstAviDemux * avi, GstSegment * segment)
gst_avi_demux_get_entry_info (avi, ostream, index,
NULL, NULL, NULL, NULL, &kentry);
if (!kentry) {
index = gst_avi_demux_index_prev (avi, ostream, index,
GST_AVI_INDEX_ENTRY_FLAG_KEYFRAME);
index = gst_avi_demux_index_prev (avi, ostream, index, TRUE);
}
gst_avi_demux_move_stream (avi, ostream, segment, index);
}
@ -4457,7 +4459,7 @@ gst_avi_demux_advance (GstAviDemux * avi, GstAviStream * stream,
/* backwards, stop becomes step, find a new step */
stream->stop_entry = stream->step_entry;
stream->step_entry = gst_avi_demux_index_prev (avi, stream,
stream->stop_entry, GST_AVI_INDEX_ENTRY_FLAG_KEYFRAME);
stream->stop_entry, TRUE);
stream->current_entry = stream->step_entry;
GST_DEBUG_OBJECT (avi,

View file

@ -47,7 +47,6 @@ G_BEGIN_DECLS
((((chunkid) & 0xff) - '0') * 10 + \
(((chunkid) >> 8) & 0xff) - '0')
#define GST_AVI_INDEX_ENTRY_FLAG_KEYFRAME 1
/* new index entries 24 bytes */
typedef struct {
@ -57,6 +56,11 @@ typedef struct {
guint64 total; /* total bytes before */
} GstAviIndexEntry;
#define GST_AVI_KEYFRAME 1
#define ENTRY_IS_KEYFRAME(e) (((e)->flags & GST_AVI_KEYFRAME) == GST_AVI_KEYFRAME)
#define ENTRY_SET_KEYFRAME(e) ((e)->flags |= GST_AVI_KEYFRAME)
#define ENTRY_UNSET_KEYFRAME(e) ((e)->flags &= ~(GST_AVI_KEYFRAME))
typedef struct {
/* index of this streamcontext */
guint num;