1
0
mirror of https://github.com/FFmpeg/FFmpeg.git synced 2024-11-21 10:55:51 +02:00

avformat/oggparseopus: factor opus_duration() out

Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
Michael Niedermayer 2013-12-11 04:15:38 +01:00
parent 43f9255368
commit 39d11d599c

View File

@ -82,6 +82,26 @@ static int opus_header(AVFormatContext *avf, int idx)
return 0; 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) static int opus_packet(AVFormatContext *avf, int idx)
{ {
struct ogg *ogg = avf->priv_data; struct ogg *ogg = avf->priv_data;
@ -89,26 +109,12 @@ static int opus_packet(AVFormatContext *avf, int idx)
AVStream *st = avf->streams[idx]; AVStream *st = avf->streams[idx];
struct oggopus_private *priv = os->private; struct oggopus_private *priv = os->private;
uint8_t *packet = os->buf + os->pstart; uint8_t *packet = os->buf + os->pstart;
unsigned toc, toc_config, toc_count, frame_size, nb_frames = 1;
if (!os->psize) if (!os->psize)
return AVERROR_INVALIDDATA; 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 (os->lastpts != AV_NOPTS_VALUE) {
if (st->start_time == AV_NOPTS_VALUE) if (st->start_time == AV_NOPTS_VALUE)
st->start_time = os->lastpts; st->start_time = os->lastpts;