diff options
author | Wim Taymans <wim.taymans@collabora.co.uk> | 2009-09-22 12:35:30 +0200 |
---|---|---|
committer | Wim Taymans <wim@metal.(none)> | 2009-09-28 22:16:46 +0200 |
commit | 0d70fe30a8fad452627e2f6c9402bacc4506bc39 (patch) | |
tree | b102269c0c9662f9a787ea610fafe749b8cf714c | |
parent | b4a490655a1ac2ad4d6efcb65e974fb9e1b46c62 (diff) |
avidemux: small cleanups
-rw-r--r-- | gst/avi/gstavidemux.c | 48 | ||||
-rw-r--r-- | gst/avi/gstavidemux.h | 6 |
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 | |||
55 | GST_DEBUG_CATEGORY_STATIC (avidemux_debug); | 58 | GST_DEBUG_CATEGORY_STATIC (avidemux_debug); |
56 | #define GST_CAT_DEFAULT avidemux_debug | 59 | #define GST_CAT_DEFAULT avidemux_debug |
57 | GST_DEBUG_CATEGORY_STATIC (GST_CAT_PERFORMANCE); | 60 | GST_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 */ |
1875 | static guint | 1878 | static guint |
1876 | gst_avi_demux_index_prev (GstAviDemux * avi, GstAviStream * stream, | 1879 | gst_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 | ||
1891 | static guint | 1894 | static guint |
1892 | gst_avi_demux_index_next (GstAviDemux * avi, GstAviStream * stream, | 1895 | gst_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 */ |
53 | typedef struct { | 52 | typedef 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 | |||
60 | typedef struct { | 64 | typedef struct { |
61 | /* index of this streamcontext */ | 65 | /* index of this streamcontext */ |
62 | guint num; | 66 | guint num; |