diff options
author | Wim Taymans <wim.taymans@gmail.com> | 2008-10-08 13:31:44 +0000 |
---|---|---|
committer | Wim Taymans <wim.taymans@gmail.com> | 2008-10-08 13:31:44 +0000 |
commit | b9a1894e5c5b2f07cdb20c7465d6915aaedec438 (patch) | |
tree | a8147f311b4431bb5dee106b20581dcb36a2a097 /gst/avi | |
parent | 0e9db391c73bba77851d7d5f637b4f305c61d364 (diff) |
gst/avi/gstavidemux.*: For timestamping audio packets we need to take into account the amount of blocks in one entry ...
Original commit message from CVS:
* gst/avi/gstavidemux.c: (gst_avi_demux_parse_subindex),
(gst_avi_demux_parse_stream), (gst_avi_demux_parse_index):
* gst/avi/gstavidemux.h:
For timestamping audio packets we need to take into account the
amount of blocks in one entry using the blockalign. Fixes some sync
issues with zero-padded audio blocks in the beginning of avi files.
Diffstat (limited to 'gst/avi')
-rw-r--r-- | gst/avi/gstavidemux.c | 37 | ||||
-rw-r--r-- | gst/avi/gstavidemux.h | 1 |
2 files changed, 33 insertions, 5 deletions
diff --git a/gst/avi/gstavidemux.c b/gst/avi/gstavidemux.c index 4f669928..a0b47412 100644 --- a/gst/avi/gstavidemux.c +++ b/gst/avi/gstavidemux.c @@ -1035,9 +1035,14 @@ gst_avi_demux_parse_subindex (GstAviDemux * avi, /* timestamps */ entry->ts = stream->idx_duration; if (stream->is_vbr) { - /* VBR get next timestamp */ - gst_avi_demux_src_convert (stream->pad, GST_FORMAT_DEFAULT, - stream->total_frames + 1, &format, &next_ts); + /* VBR stream next timestamp */ + if (stream->strh->type == GST_RIFF_FCC_auds) { + gst_avi_demux_src_convert (stream->pad, GST_FORMAT_DEFAULT, + stream->total_blocks + 1, &format, &next_ts); + } else { + gst_avi_demux_src_convert (stream->pad, GST_FORMAT_DEFAULT, + stream->total_frames + 1, &format, &next_ts); + } } else { /* CBR get next timestamp */ gst_avi_demux_src_convert (stream->pad, GST_FORMAT_BYTES, @@ -1052,6 +1057,14 @@ gst_avi_demux_parse_subindex (GstAviDemux * avi, stream->total_bytes += entry->size; stream->total_frames++; + 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; + else + stream->total_blocks++; + } stream->idx_duration = next_ts; entries_list = g_list_prepend (entries_list, entry); @@ -1615,6 +1628,7 @@ gst_avi_demux_parse_stream (GstAviDemux * avi, GstBuffer * buf) stream->num = avi->num_streams; stream->total_bytes = 0; stream->total_frames = 0; + stream->total_blocks = 0; stream->current_frame = 0; stream->current_byte = 0; gst_pad_set_element_private (pad, stream); @@ -1847,8 +1861,13 @@ gst_avi_demux_parse_index (GstAviDemux * avi, target->ts = stream->idx_duration; if (stream->is_vbr) { /* VBR stream next timestamp */ - gst_avi_demux_src_convert (stream->pad, GST_FORMAT_DEFAULT, - stream->total_frames + 1, &format, &next_ts); + if (stream->strh->type == GST_RIFF_FCC_auds) { + gst_avi_demux_src_convert (stream->pad, GST_FORMAT_DEFAULT, + stream->total_blocks + 1, &format, &next_ts); + } else { + gst_avi_demux_src_convert (stream->pad, GST_FORMAT_DEFAULT, + stream->total_frames + 1, &format, &next_ts); + } } else { /* constant rate stream */ gst_avi_demux_src_convert (stream->pad, GST_FORMAT_BYTES, @@ -1863,6 +1882,14 @@ gst_avi_demux_parse_index (GstAviDemux * avi, stream->total_bytes += target->size; stream->total_frames++; + if (stream->strh->type == GST_RIFF_FCC_auds) { + if (stream->strf.auds->blockalign > 0) + stream->total_blocks += + (target->size + stream->strf.auds->blockalign - + 1) / stream->strf.auds->blockalign; + else + stream->total_blocks++; + } stream->idx_duration = next_ts; GST_LOG_OBJECT (avi, diff --git a/gst/avi/gstavidemux.h b/gst/avi/gstavidemux.h index 09e12b59..1537f915 100644 --- a/gst/avi/gstavidemux.h +++ b/gst/avi/gstavidemux.h @@ -89,6 +89,7 @@ typedef struct { /* stream length */ guint64 total_bytes; guint32 total_frames; + guint32 total_blocks; /* stream length according to index */ GstClockTime idx_duration; /* stream length according to header */ |