X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Fmpeg4video_parser.c;h=e291262d94f7ba9ea6b46d606f346f3bc07d7561;hb=42b9150b0d4f0a130c1d93dc991fd5412743a8cf;hp=9accc91265e7613a2d4a2c933b292ee941789669;hpb=df495dbd9a5fc5053d5e7e6976932bb104cde4a6;p=ffmpeg diff --git a/libavcodec/mpeg4video_parser.c b/libavcodec/mpeg4video_parser.c index 9accc91265e..e291262d94f 100644 --- a/libavcodec/mpeg4video_parser.c +++ b/libavcodec/mpeg4video_parser.c @@ -1,29 +1,35 @@ /* * MPEG4 Video frame extraction - * Copyright (c) 2003 Fabrice Bellard. - * Copyright (c) 2003 Michael Niedermayer. + * Copyright (c) 2003 Fabrice Bellard + * Copyright (c) 2003 Michael Niedermayer * - * This file is part of FFmpeg. + * This file is part of Libav. * - * FFmpeg is free software; you can redistribute it and/or + * Libav 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. * - * FFmpeg is distributed in the hope that it will be useful, + * Libav 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 FFmpeg; if not, write to the Free Software + * License along with Libav; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include "parser.h" #include "mpegvideo.h" +#include "mpeg4video.h" #include "mpeg4video_parser.h" +struct Mp4vParseContext { + ParseContext pc; + struct MpegEncContext enc; + int first_picture; +}; int ff_mpeg4_find_frame_end(ParseContext *pc, const uint8_t *buf, int buf_size){ int vop_found, i; @@ -67,8 +73,8 @@ static int av_mpeg4_decode_header(AVCodecParserContext *s1, AVCodecContext *avctx, const uint8_t *buf, int buf_size) { - ParseContext1 *pc = s1->priv_data; - MpegEncContext *s = pc->enc; + struct Mp4vParseContext *pc = s1->priv_data; + MpegEncContext *s = &pc->enc; GetBitContext gb1, *gb = &gb1; int ret; @@ -82,7 +88,7 @@ static int av_mpeg4_decode_header(AVCodecParserContext *s1, init_get_bits(gb, buf, 8 * buf_size); ret = ff_mpeg4_decode_picture_header(s, gb); - if (s->width) { + if (s->width && (!avctx->width || !avctx->height || !avctx->coded_width || !avctx->coded_height)) { avcodec_set_dimensions(avctx, s->width, s->height); } s1->pict_type= s->pict_type; @@ -90,14 +96,12 @@ static int av_mpeg4_decode_header(AVCodecParserContext *s1, return ret; } -static int mpeg4video_parse_init(AVCodecParserContext *s) +static av_cold int mpeg4video_parse_init(AVCodecParserContext *s) { - ParseContext1 *pc = s->priv_data; + struct Mp4vParseContext *pc = s->priv_data; - pc->enc = av_mallocz(sizeof(MpegEncContext)); - if (!pc->enc) - return -1; pc->first_picture = 1; + pc->enc.slice_context_count = 1; return 0; } @@ -128,11 +132,11 @@ static int mpeg4video_parse(AVCodecParserContext *s, } -AVCodecParser mpeg4video_parser = { - { CODEC_ID_MPEG4 }, - sizeof(ParseContext1), - mpeg4video_parse_init, - mpeg4video_parse, - ff_parse1_close, - ff_mpeg4video_split, +AVCodecParser ff_mpeg4video_parser = { + .codec_ids = { AV_CODEC_ID_MPEG4 }, + .priv_data_size = sizeof(struct Mp4vParseContext), + .parser_init = mpeg4video_parse_init, + .parser_parse = mpeg4video_parse, + .parser_close = ff_parse_close, + .split = ff_mpeg4video_split, };