diff options
Diffstat (limited to 'libavformat/voc_packet.c')
-rw-r--r-- | libavformat/voc_packet.c | 36 |
1 files changed, 29 insertions, 7 deletions
diff --git a/libavformat/voc_packet.c b/libavformat/voc_packet.c index 9e1c746..f4b8231 100644 --- a/libavformat/voc_packet.c +++ b/libavformat/voc_packet.c @@ -1,21 +1,24 @@ /* - * This file is part of Libav. + * Copyright (c) 2006 Aurelien Jacobs <aurel@gnuage.org> * - * Libav is free software; you can redistribute it and/or + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * - * Libav is distributed in the hope that it will be useful, + * FFmpeg is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with Libav; if not, write to the Free Software + * License along with FFmpeg; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ +#include "libavutil/intreadwrite.h" #include "avformat.h" #include "internal.h" #include "voc.h" @@ -30,11 +33,20 @@ ff_voc_get_packet(AVFormatContext *s, AVPacket *pkt, AVStream *st, int max_size) int size, tmp_codec=-1; int sample_rate = 0; int channels = 1; + int64_t duration; + int ret; + + av_add_index_entry(st, + avio_tell(pb), + voc->pts, + voc->remaining_size, + 0, + AVINDEX_KEYFRAME); while (!voc->remaining_size) { type = avio_r8(pb); if (type == VOC_TYPE_EOF) - return AVERROR(EIO); + return AVERROR_EOF; voc->remaining_size = avio_rl24(pb); if (!voc->remaining_size) { if (!s->pb->seekable) @@ -109,11 +121,21 @@ ff_voc_get_packet(AVFormatContext *s, AVPacket *pkt, AVStream *st, int max_size) } } - dec->bit_rate = dec->sample_rate * dec->bits_per_coded_sample; + dec->bit_rate = dec->sample_rate * dec->channels * dec->bits_per_coded_sample; if (max_size <= 0) max_size = 2048; size = FFMIN(voc->remaining_size, max_size); voc->remaining_size -= size; - return av_get_packet(pb, pkt, size); + + ret = av_get_packet(pb, pkt, size); + pkt->dts = pkt->pts = voc->pts; + + duration = av_get_audio_frame_duration(st->codec, size); + if (duration > 0 && voc->pts != AV_NOPTS_VALUE) + voc->pts += duration; + else + voc->pts = AV_NOPTS_VALUE; + + return ret; } |