summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWim Taymans <wim.taymans@collabora.co.uk>2009-09-22 12:35:30 +0200
committerWim Taymans <wim@metal.(none)>2009-09-28 22:16:46 +0200
commit0d70fe30a8fad452627e2f6c9402bacc4506bc39 (patch)
treeb102269c0c9662f9a787ea610fafe749b8cf714c
parentb4a490655a1ac2ad4d6efcb65e974fb9e1b46c62 (diff)
avidemux: small cleanups
-rw-r--r--gst/avi/gstavidemux.c48
-rw-r--r--gst/avi/gstavidemux.h6
2 files changed, 30 insertions, 24 deletions
diff --git a/gst/avi/gstavidemux.c b/gst/avi/gstavidemux.c
index 2caeba0c2..7a1f96a85 100644
--- a/gst/avi/gstavidemux.c
+++ b/gst/avi/gstavidemux.c
@@ -52,6 +52,9 @@
52#include <gst/gst-i18n-plugin.h> 52#include <gst/gst-i18n-plugin.h>
53#include <gst/base/gstadapter.h> 53#include <gst/base/gstadapter.h>
54 54
55
56#define DIV_ROUND_UP(s,v) ((s) + ((v)-1) / (v))
57
55GST_DEBUG_CATEGORY_STATIC (avidemux_debug); 58GST_DEBUG_CATEGORY_STATIC (avidemux_debug);
56#define GST_CAT_DEFAULT avidemux_debug 59#define GST_CAT_DEFAULT avidemux_debug
57GST_DEBUG_CATEGORY_STATIC (GST_CAT_PERFORMANCE); 60GST_DEBUG_CATEGORY_STATIC (GST_CAT_PERFORMANCE);
@@ -1874,14 +1877,14 @@ gst_avi_demux_index_last (GstAviDemux * avi, GstAviStream * stream)
1874/* find a previous entry in the index with the given flags */ 1877/* find a previous entry in the index with the given flags */
1875static guint 1878static guint
1876gst_avi_demux_index_prev (GstAviDemux * avi, GstAviStream * stream, 1879gst_avi_demux_index_prev (GstAviDemux * avi, GstAviStream * stream,
1877 guint last, guint32 flags) 1880 guint last, gboolean keyframe)
1878{ 1881{
1879 GstAviIndexEntry *entry; 1882 GstAviIndexEntry *entry;
1880 guint i; 1883 guint i;
1881 1884
1882 for (i = last; i > 0; i--) { 1885 for (i = last; i > 0; i--) {
1883 entry = &stream->index[i - 1]; 1886 entry = &stream->index[i - 1];
1884 if ((entry->flags & flags) == flags) { 1887 if (!keyframe || ENTRY_IS_KEYFRAME (entry)) {
1885 return i; 1888 return i;
1886 } 1889 }
1887 } 1890 }
@@ -1890,14 +1893,14 @@ gst_avi_demux_index_prev (GstAviDemux * avi, GstAviStream * stream,
1890 1893
1891static guint 1894static guint
1892gst_avi_demux_index_next (GstAviDemux * avi, GstAviStream * stream, 1895gst_avi_demux_index_next (GstAviDemux * avi, GstAviStream * stream,
1893 guint last, guint32 flags) 1896 guint last, gboolean keyframe)
1894{ 1897{
1895 GstAviIndexEntry *entry; 1898 GstAviIndexEntry *entry;
1896 gint i; 1899 gint i;
1897 1900
1898 for (i = last + 1; i < stream->idx_n; i++) { 1901 for (i = last + 1; i < stream->idx_n; i++) {
1899 entry = &stream->index[i]; 1902 entry = &stream->index[i];
1900 if ((entry->flags & flags) == flags) { 1903 if (!keyframe || ENTRY_IS_KEYFRAME (entry)) {
1901 return i; 1904 return i;
1902 } 1905 }
1903 } 1906 }
@@ -2020,7 +2023,7 @@ gst_avi_demux_get_entry_info (GstAviDemux * avi, GstAviStream * stream,
2020 if (size) 2023 if (size)
2021 *size = entry->size; 2024 *size = entry->size;
2022 if (keyframe) 2025 if (keyframe)
2023 *keyframe = (entry->flags & GST_AVI_INDEX_ENTRY_FLAG_KEYFRAME) != 0; 2026 *keyframe = ENTRY_IS_KEYFRAME (entry);
2024} 2027}
2025 2028
2026 2029
@@ -2101,15 +2104,17 @@ gst_avi_demux_parse_index (GstAviDemux * avi, GstBuffer * buf)
2101 /* handle flags */ 2104 /* handle flags */
2102 if (stream->strh->type == GST_RIFF_FCC_auds) { 2105 if (stream->strh->type == GST_RIFF_FCC_auds) {
2103 /* all audio frames are keyframes */ 2106 /* all audio frames are keyframes */
2104 entry.flags = GST_AVI_INDEX_ENTRY_FLAG_KEYFRAME; 2107 ENTRY_SET_KEYFRAME (&entry);
2105 stream->n_keyframes++; 2108 stream->n_keyframes++;
2106 } else { 2109 } else {
2107 entry.flags = GST_READ_UINT32_LE (&index[i].flags); 2110 guint32 flags;
2108 if (entry.flags & GST_RIFF_IF_KEYFRAME) { 2111 /* else read flags */
2109 entry.flags = GST_AVI_INDEX_ENTRY_FLAG_KEYFRAME; 2112 flags = GST_READ_UINT32_LE (&index[i].flags);
2113 if (flags & GST_RIFF_IF_KEYFRAME) {
2114 ENTRY_SET_KEYFRAME (&entry);
2110 stream->n_keyframes++; 2115 stream->n_keyframes++;
2111 } else { 2116 } else {
2112 entry.flags = 0; 2117 ENTRY_UNSET_KEYFRAME (&entry);
2113 } 2118 }
2114 } 2119 }
2115 2120
@@ -2120,10 +2125,9 @@ gst_avi_demux_parse_index (GstAviDemux * avi, GstBuffer * buf)
2120 entry.total = stream->total_bytes; 2125 entry.total = stream->total_bytes;
2121 stream->total_bytes += entry.size; 2126 stream->total_bytes += entry.size;
2122 if (stream->strh->type == GST_RIFF_FCC_auds) { 2127 if (stream->strh->type == GST_RIFF_FCC_auds) {
2123 if (stream->strf.auds->blockalign > 0) 2128 gint blockalign = stream->strf.auds->blockalign;
2124 stream->total_blocks += 2129 if (blockalign > 0)
2125 (entry.size + stream->strf.auds->blockalign - 2130 stream->total_blocks += DIV_ROUND_UP (entry.size, blockalign);
2126 1) / stream->strf.auds->blockalign;
2127 else 2131 else
2128 stream->total_blocks++; 2132 stream->total_blocks++;
2129 } 2133 }
@@ -2148,9 +2152,10 @@ gst_avi_demux_parse_index (GstAviDemux * avi, GstBuffer * buf)
2148 } 2152 }
2149 2153
2150 GST_LOG_OBJECT (avi, 2154 GST_LOG_OBJECT (avi,
2151 "Adding stream %d, index entry %d, flags %02x, size %u " 2155 "Adding stream %d, index entry %d, kf %d, size %u "
2152 ", offset %" G_GUINT64_FORMAT ", total %" G_GUINT64_FORMAT, stream_nr, 2156 ", offset %" G_GUINT64_FORMAT ", total %" G_GUINT64_FORMAT, stream_nr,
2153 stream->idx_n, entry.flags, entry.size, entry.offset, entry.total); 2157 stream->idx_n, ENTRY_IS_KEYFRAME (&entry), entry.size, entry.offset,
2158 entry.total);
2154 2159
2155 /* and copy */ 2160 /* and copy */
2156 stream->index[stream->idx_n++] = entry; 2161 stream->index[stream->idx_n++] = entry;
@@ -3861,8 +3866,7 @@ gst_avi_demux_move_stream (GstAviDemux * avi, GstAviStream * stream,
3861 * to the next keyframe. If there is a smart decoder downstream he will notice 3866 * to the next keyframe. If there is a smart decoder downstream he will notice
3862 * that there are too many encoded frames send and return UNEXPECTED when there 3867 * that there are too many encoded frames send and return UNEXPECTED when there
3863 * are enough decoded frames to fill the segment. */ 3868 * are enough decoded frames to fill the segment. */
3864 next_key = gst_avi_demux_index_next (avi, stream, index, 3869 next_key = gst_avi_demux_index_next (avi, stream, index, TRUE);
3865 GST_AVI_INDEX_ENTRY_FLAG_KEYFRAME);
3866 3870
3867 stream->start_entry = 0; 3871 stream->start_entry = 0;
3868 stream->step_entry = index; 3872 stream->step_entry = index;
@@ -3916,8 +3920,7 @@ gst_avi_demux_do_seek (GstAviDemux * avi, GstSegment * segment)
3916 GST_DEBUG_OBJECT (avi, "not keyframe, searching back"); 3920 GST_DEBUG_OBJECT (avi, "not keyframe, searching back");
3917 /* now go to the previous keyframe, this is where we should start 3921 /* now go to the previous keyframe, this is where we should start
3918 * decoding from. */ 3922 * decoding from. */
3919 index = gst_avi_demux_index_prev (avi, stream, index, 3923 index = gst_avi_demux_index_prev (avi, stream, index, TRUE);
3920 GST_AVI_INDEX_ENTRY_FLAG_KEYFRAME);
3921 GST_DEBUG_OBJECT (avi, "previous keyframe at %u", index); 3924 GST_DEBUG_OBJECT (avi, "previous keyframe at %u", index);
3922 } 3925 }
3923 3926
@@ -3953,8 +3956,7 @@ gst_avi_demux_do_seek (GstAviDemux * avi, GstSegment * segment)
3953 gst_avi_demux_get_entry_info (avi, ostream, index, 3956 gst_avi_demux_get_entry_info (avi, ostream, index,
3954 NULL, NULL, NULL, NULL, &kentry); 3957 NULL, NULL, NULL, NULL, &kentry);
3955 if (!kentry) { 3958 if (!kentry) {
3956 index = gst_avi_demux_index_prev (avi, ostream, index, 3959 index = gst_avi_demux_index_prev (avi, ostream, index, TRUE);
3957 GST_AVI_INDEX_ENTRY_FLAG_KEYFRAME);
3958 } 3960 }
3959 gst_avi_demux_move_stream (avi, ostream, segment, index); 3961 gst_avi_demux_move_stream (avi, ostream, segment, index);
3960 } 3962 }
@@ -4457,7 +4459,7 @@ gst_avi_demux_advance (GstAviDemux * avi, GstAviStream * stream,
4457 /* backwards, stop becomes step, find a new step */ 4459 /* backwards, stop becomes step, find a new step */
4458 stream->stop_entry = stream->step_entry; 4460 stream->stop_entry = stream->step_entry;
4459 stream->step_entry = gst_avi_demux_index_prev (avi, stream, 4461 stream->step_entry = gst_avi_demux_index_prev (avi, stream,
4460 stream->stop_entry, GST_AVI_INDEX_ENTRY_FLAG_KEYFRAME); 4462 stream->stop_entry, TRUE);
4461 stream->current_entry = stream->step_entry; 4463 stream->current_entry = stream->step_entry;
4462 4464
4463 GST_DEBUG_OBJECT (avi, 4465 GST_DEBUG_OBJECT (avi,
diff --git a/gst/avi/gstavidemux.h b/gst/avi/gstavidemux.h
index 918939296..93fb432ab 100644
--- a/gst/avi/gstavidemux.h
+++ b/gst/avi/gstavidemux.h
@@ -47,7 +47,6 @@ G_BEGIN_DECLS
47 ((((chunkid) & 0xff) - '0') * 10 + \ 47 ((((chunkid) & 0xff) - '0') * 10 + \
48 (((chunkid) >> 8) & 0xff) - '0') 48 (((chunkid) >> 8) & 0xff) - '0')
49 49
50#define GST_AVI_INDEX_ENTRY_FLAG_KEYFRAME 1
51 50
52/* new index entries 24 bytes */ 51/* new index entries 24 bytes */
53typedef struct { 52typedef struct {
@@ -57,6 +56,11 @@ typedef struct {
57 guint64 total; /* total bytes before */ 56 guint64 total; /* total bytes before */
58} GstAviIndexEntry; 57} GstAviIndexEntry;
59 58
59#define GST_AVI_KEYFRAME 1
60#define ENTRY_IS_KEYFRAME(e) (((e)->flags & GST_AVI_KEYFRAME) == GST_AVI_KEYFRAME)
61#define ENTRY_SET_KEYFRAME(e) ((e)->flags |= GST_AVI_KEYFRAME)
62#define ENTRY_UNSET_KEYFRAME(e) ((e)->flags &= ~(GST_AVI_KEYFRAME))
63
60typedef struct { 64typedef struct {
61 /* index of this streamcontext */ 65 /* index of this streamcontext */
62 guint num; 66 guint num;