[FFmpeg-cvslog] avformat/oggparseopus: factor opus_duration() out
Michael Niedermayer
git at videolan.org
Thu Sep 11 23:51:29 CEST 2014
ffmpeg | branch: release/2.1 | Michael Niedermayer <michaelni at gmx.at> | Wed Dec 11 04:15:38 2013 +0100| [6f6b1d0ddb26a95d5d210ed4566f141b83d774c1] | committer: Carl Eugen Hoyos
avformat/oggparseopus: factor opus_duration() out
Signed-off-by: Michael Niedermayer <michaelni at gmx.at>
(cherry picked from commit 39d11d599cd292485fe991cd22e10d7a1738b3bc)
> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=6f6b1d0ddb26a95d5d210ed4566f141b83d774c1
---
libavformat/oggparseopus.c | 36 +++++++++++++++++++++---------------
1 file changed, 21 insertions(+), 15 deletions(-)
diff --git a/libavformat/oggparseopus.c b/libavformat/oggparseopus.c
index 78aa333..5a80314 100644
--- a/libavformat/oggparseopus.c
+++ b/libavformat/oggparseopus.c
@@ -81,6 +81,26 @@ static int opus_header(AVFormatContext *avf, int idx)
return 0;
}
+static int opus_duration(uint8_t *src, int size)
+{
+ unsigned nb_frames = 1;
+ unsigned toc = src[0];
+ unsigned toc_config = toc >> 3;
+ unsigned toc_count = toc & 3;
+ unsigned frame_size = toc_config < 12 ? FFMAX(480, 960 * (toc_config & 3)) :
+ toc_config < 16 ? 480 << (toc_config & 1) :
+ 120 << (toc_config & 3);
+ if (toc_count == 3) {
+ if (size<2)
+ return AVERROR_INVALIDDATA;
+ nb_frames = src[1] & 0x3F;
+ } else if (toc_count) {
+ nb_frames = 2;
+ }
+
+ return frame_size * nb_frames;
+}
+
static int opus_packet(AVFormatContext *avf, int idx)
{
struct ogg *ogg = avf->priv_data;
@@ -88,26 +108,12 @@ static int opus_packet(AVFormatContext *avf, int idx)
AVStream *st = avf->streams[idx];
struct oggopus_private *priv = os->private;
uint8_t *packet = os->buf + os->pstart;
- unsigned toc, toc_config, toc_count, frame_size, nb_frames = 1;
if (!os->psize)
return AVERROR_INVALIDDATA;
- toc = *packet;
- toc_config = toc >> 3;
- toc_count = toc & 3;
- frame_size = toc_config < 12 ? FFMAX(480, 960 * (toc_config & 3)) :
- toc_config < 16 ? 480 << (toc_config & 1) :
- 120 << (toc_config & 3);
- if (toc_count == 3) {
- if (os->psize < 2)
- return AVERROR_INVALIDDATA;
- nb_frames = packet[1] & 0x3F;
- } else if (toc_count) {
- nb_frames = 2;
- }
- os->pduration = frame_size * nb_frames;
+ os->pduration = opus_duration(packet, os->psize);
if (os->lastpts != AV_NOPTS_VALUE) {
if (st->start_time == AV_NOPTS_VALUE)
st->start_time = os->lastpts;
More information about the ffmpeg-cvslog
mailing list