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:
parent
43f9255368
commit
39d11d599c
@ -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;
|
||||||
|
Loading…
Reference in New Issue
Block a user