diff options
Diffstat (limited to 'ffmpeg/libavformat/oggparseflac.c')
| -rw-r--r-- | ffmpeg/libavformat/oggparseflac.c | 30 |
1 files changed, 25 insertions, 5 deletions
diff --git a/ffmpeg/libavformat/oggparseflac.c b/ffmpeg/libavformat/oggparseflac.c index 3ff594e..f69533f 100644 --- a/ffmpeg/libavformat/oggparseflac.c +++ b/ffmpeg/libavformat/oggparseflac.c @@ -62,10 +62,9 @@ flac_header (AVFormatContext * s, int idx) st->codec->codec_id = AV_CODEC_ID_FLAC; st->need_parsing = AVSTREAM_PARSE_HEADERS; - st->codec->extradata = - av_malloc(FLAC_STREAMINFO_SIZE + FF_INPUT_BUFFER_PADDING_SIZE); - memcpy(st->codec->extradata, streaminfo_start, FLAC_STREAMINFO_SIZE); - st->codec->extradata_size = FLAC_STREAMINFO_SIZE; + if (ff_alloc_extradata(st->codec, FLAC_STREAMINFO_SIZE) < 0) + return AVERROR(ENOMEM); + memcpy(st->codec->extradata, streaminfo_start, st->codec->extradata_size); avpriv_set_pts_info(st, 64, 1, st->codec->sample_rate); } else if (mdt == FLAC_METADATA_TYPE_VORBIS_COMMENT) { @@ -78,11 +77,32 @@ flac_header (AVFormatContext * s, int idx) static int old_flac_header (AVFormatContext * s, int idx) { + struct ogg *ogg = s->priv_data; AVStream *st = s->streams[idx]; + struct ogg_stream *os = ogg->streams + idx; + AVCodecParserContext *parser = av_parser_init(AV_CODEC_ID_FLAC); + int size; + uint8_t *data; + + if (!parser) + return -1; + st->codec->codec_type = AVMEDIA_TYPE_AUDIO; st->codec->codec_id = AV_CODEC_ID_FLAC; - return 0; + parser->flags = PARSER_FLAG_COMPLETE_FRAMES; + av_parser_parse2(parser, st->codec, + &data, &size, os->buf + os->pstart, os->psize, + AV_NOPTS_VALUE, AV_NOPTS_VALUE, -1); + + av_parser_close(parser); + + if (st->codec->sample_rate) { + avpriv_set_pts_info(st, 64, 1, st->codec->sample_rate); + return 0; + } + + return 1; } const struct ogg_codec ff_flac_codec = { |
