X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Fh261dec.c;h=9a323ec7d127c830bb25895f49b8f6ebe213eab1;hb=d182d8a6d3203f7fbab11179e88f26b8befe899e;hp=2832c622e8eb5cba9179036a10b2ac83ccbf426e;hpb=c59967fa7cc5bc2fa06b36c17d2c207240c06b3e;p=ffmpeg diff --git a/libavcodec/h261dec.c b/libavcodec/h261dec.c index 2832c622e8e..9a323ec7d12 100644 --- a/libavcodec/h261dec.c +++ b/libavcodec/h261dec.c @@ -1,5 +1,5 @@ /* - * H261 decoder + * H.261 decoder * Copyright (c) 2002-2004 Michael Niedermayer * Copyright (c) 2004 Maarten Daniels * @@ -26,9 +26,12 @@ */ #include "avcodec.h" +#include "mpeg_er.h" +#include "mpegutils.h" #include "mpegvideo.h" #include "h263.h" #include "h261.h" +#include "internal.h" #define H261_MBA_VLC_BITS 9 #define H261_MTYPE_VLC_BITS 6 @@ -71,7 +74,7 @@ static av_cold int h261_decode_init(AVCodecContext *avctx) MpegEncContext *const s = &h->s; // set defaults - ff_MPV_decode_defaults(s); + ff_mpv_decode_defaults(s); s->avctx = avctx; s->width = s->avctx->coded_width; s->height = s->avctx->coded_height; @@ -215,7 +218,7 @@ static int h261_decode_mb_skipped(H261Context *h, int mba1, int mba2) s->mb_skipped = 1; h->mtype &= ~MB_TYPE_H261_FIL; - ff_MPV_decode_mb(s, s->block); + ff_mpv_decode_mb(s, s->block); } return 0; @@ -431,7 +434,7 @@ static int h261_decode_mb(H261Context *h) intra: /* decode each block */ if (s->mb_intra || HAS_CBP(h->mtype)) { - s->dsp.clear_blocks(s->block[0]); + s->bdsp.clear_blocks(s->block[0]); for (i = 0; i < 6; i++) { if (h261_decode_block(h, s->block[i], i, cbp & 32) < 0) return SLICE_ERROR; @@ -442,7 +445,7 @@ intra: s->block_last_index[i] = -1; } - ff_MPV_decode_mb(s, s->block); + ff_mpv_decode_mb(s, s->block); return SLICE_OK; } @@ -475,8 +478,7 @@ static int h261_decode_picture_header(H261Context *h) i += 32; s->picture_number = (s->picture_number & ~31) + i; - s->avctx->time_base = (AVRational) { 1001, 30000 }; - s->current_picture.f.pts = s->picture_number; + s->avctx->framerate = (AVRational) { 30000, 1001 }; /* PTYPE starts here */ skip_bits1(&s->gb); /* split screen off */ @@ -569,10 +571,8 @@ static int h261_decode_frame(AVCodecContext *avctx, void *data, int ret; AVFrame *pict = data; - av_dlog(avctx, "*****frame %d size=%d\n", avctx->frame_number, buf_size); - av_dlog(avctx, "bytes=%x %x %x %x\n", buf[0], buf[1], buf[2], buf[3]); - s->flags = avctx->flags; - s->flags2 = avctx->flags2; + ff_dlog(avctx, "*****frame %d size=%d\n", avctx->frame_number, buf_size); + ff_dlog(avctx, "bytes=%x %x %x %x\n", buf[0], buf[1], buf[2], buf[3]); h->gob_start_code_skipped = 0; @@ -580,18 +580,8 @@ retry: init_get_bits(&s->gb, buf, buf_size * 8); if (!s->context_initialized) - // we need the IDCT permutaton for reading a custom matrix - if (ff_MPV_common_init(s) < 0) - return -1; - - /* We need to set current_picture_ptr before reading the header, - * otherwise we cannot store anything in there. */ - if (s->current_picture_ptr == NULL || s->current_picture_ptr->f.data[0]) { - int i = ff_find_unused_picture(s, 0); - if (i < 0) - return i; - s->current_picture_ptr = &s->picture[i]; - } + // we need the IDCT permutation for reading a custom matrix + ff_mpv_idct_init(s); ret = h261_decode_picture_header(h); @@ -604,25 +594,31 @@ retry: if (s->width != avctx->coded_width || s->height != avctx->coded_height) { ParseContext pc = s->parse_context; // FIXME move this demuxing hack to libavformat s->parse_context.buffer = 0; - ff_MPV_common_end(s); + ff_mpv_common_end(s); s->parse_context = pc; } + if (!s->context_initialized) { - avcodec_set_dimensions(avctx, s->width, s->height); + if ((ret = ff_mpv_common_init(s)) < 0) + return ret; + + ret = ff_set_dimensions(avctx, s->width, s->height); + if (ret < 0) + return ret; goto retry; } // for skipping the frame - s->current_picture.f.pict_type = s->pict_type; - s->current_picture.f.key_frame = s->pict_type == AV_PICTURE_TYPE_I; + s->current_picture.f->pict_type = s->pict_type; + s->current_picture.f->key_frame = s->pict_type == AV_PICTURE_TYPE_I; if ((avctx->skip_frame >= AVDISCARD_NONREF && s->pict_type == AV_PICTURE_TYPE_B) || (avctx->skip_frame >= AVDISCARD_NONKEY && s->pict_type != AV_PICTURE_TYPE_I) || avctx->skip_frame >= AVDISCARD_ALL) return get_consumed_bytes(s, buf_size); - if (ff_MPV_frame_start(s, avctx) < 0) + if (ff_mpv_frame_start(s, avctx) < 0) return -1; ff_mpeg_er_frame_start(s); @@ -636,12 +632,12 @@ retry: break; h261_decode_gob(h); } - ff_MPV_frame_end(s); + ff_mpv_frame_end(s); - assert(s->current_picture.f.pict_type == s->current_picture_ptr->f.pict_type); - assert(s->current_picture.f.pict_type == s->pict_type); + assert(s->current_picture.f->pict_type == s->current_picture_ptr->f->pict_type); + assert(s->current_picture.f->pict_type == s->pict_type); - if ((ret = av_frame_ref(pict, &s->current_picture_ptr->f)) < 0) + if ((ret = av_frame_ref(pict, s->current_picture_ptr->f)) < 0) return ret; ff_print_debug_info(s, s->current_picture_ptr); @@ -655,18 +651,18 @@ static av_cold int h261_decode_end(AVCodecContext *avctx) H261Context *h = avctx->priv_data; MpegEncContext *s = &h->s; - ff_MPV_common_end(s); + ff_mpv_common_end(s); return 0; } AVCodec ff_h261_decoder = { .name = "h261", + .long_name = NULL_IF_CONFIG_SMALL("H.261"), .type = AVMEDIA_TYPE_VIDEO, .id = AV_CODEC_ID_H261, .priv_data_size = sizeof(H261Context), .init = h261_decode_init, .close = h261_decode_end, .decode = h261_decode_frame, - .capabilities = CODEC_CAP_DR1, - .long_name = NULL_IF_CONFIG_SMALL("H.261"), + .capabilities = AV_CODEC_CAP_DR1, };