Mercurial > libavcodec.hg
changeset 10791:48adb5a1b47b libavcodec
Split out intel H263 decoder.
author | michael |
---|---|
date | Thu, 07 Jan 2010 06:25:41 +0000 |
parents | 145b62a1de1c |
children | 13c67390a846 |
files | Makefile h263.c h263dec.c intelh263dec.c mpegvideo.h |
diffstat | 5 files changed, 137 insertions(+), 114 deletions(-) [+] |
line wrap: on
line diff
--- a/Makefile Thu Jan 07 06:20:57 2010 +0000 +++ b/Makefile Thu Jan 07 06:25:41 2010 +0000 @@ -124,7 +124,7 @@ mpegvideo_enc.o motion_est.o \ ratecontrol.o mpeg12data.o \ mpegvideo.o -OBJS-$(CONFIG_H263_DECODER) += h263dec.o h263.o flvdec.o\ +OBJS-$(CONFIG_H263_DECODER) += h263dec.o h263.o flvdec.o intelh263dec.o \ mpegvideo.o error_resilience.o OBJS-$(CONFIG_H263_VAAPI_HWACCEL) += vaapi_mpeg4.o OBJS-$(CONFIG_H263_ENCODER) += mpegvideo_enc.o motion_est.o \
--- a/h263.c Thu Jan 07 06:20:57 2010 +0000 +++ b/h263.c Thu Jan 07 06:25:41 2010 +0000 @@ -133,7 +133,7 @@ return 7; } -static void show_pict_info(MpegEncContext *s){ +void ff_h263_show_pict_info(MpegEncContext *s){ av_log(s->avctx, AV_LOG_DEBUG, "qp:%d %c size:%d rnd:%d%s%s%s%s%s%s%s%s%s %d/%d\n", s->qscale, av_get_pict_type_char(s->pict_type), s->gb.size_in_bits, 1-s->no_rounding, @@ -5359,7 +5359,7 @@ } if(s->avctx->debug&FF_DEBUG_PICT_INFO){ - show_pict_info(s); + ff_h263_show_pict_info(s); } if (s->pict_type == FF_I_TYPE && s->codec_tag == AV_RL32("ZYGO")){ int i,j; @@ -6064,98 +6064,3 @@ s->avctx->has_b_frames= !s->low_delay; return decode_vop_header(s, gb); } - -/* don't understand why they choose a different header ! */ -int intel_h263_decode_picture_header(MpegEncContext *s) -{ - int format; - - /* picture header */ - if (get_bits_long(&s->gb, 22) != 0x20) { - av_log(s->avctx, AV_LOG_ERROR, "Bad picture start code\n"); - return -1; - } - s->picture_number = get_bits(&s->gb, 8); /* picture timestamp */ - - if (get_bits1(&s->gb) != 1) { - av_log(s->avctx, AV_LOG_ERROR, "Bad marker\n"); - return -1; /* marker */ - } - if (get_bits1(&s->gb) != 0) { - av_log(s->avctx, AV_LOG_ERROR, "Bad H263 id\n"); - return -1; /* h263 id */ - } - skip_bits1(&s->gb); /* split screen off */ - skip_bits1(&s->gb); /* camera off */ - skip_bits1(&s->gb); /* freeze picture release off */ - - format = get_bits(&s->gb, 3); - if (format != 7) { - av_log(s->avctx, AV_LOG_ERROR, "Intel H263 free format not supported\n"); - return -1; - } - s->h263_plus = 0; - - s->pict_type = FF_I_TYPE + get_bits1(&s->gb); - - s->unrestricted_mv = get_bits1(&s->gb); - s->h263_long_vectors = s->unrestricted_mv; - - if (get_bits1(&s->gb) != 0) { - av_log(s->avctx, AV_LOG_ERROR, "SAC not supported\n"); - return -1; /* SAC: off */ - } - s->obmc= get_bits1(&s->gb); - s->pb_frame = get_bits1(&s->gb); - - if(format == 7){ - format = get_bits(&s->gb, 3); - if(format == 0 || format == 7){ - av_log(s->avctx, AV_LOG_ERROR, "Wrong Intel H263 format\n"); - return -1; - } - if(get_bits(&s->gb, 2)) - av_log(s->avctx, AV_LOG_ERROR, "Bad value for reserved field\n"); - s->loop_filter = get_bits1(&s->gb); - if(get_bits1(&s->gb)) - av_log(s->avctx, AV_LOG_ERROR, "Bad value for reserved field\n"); - if(get_bits1(&s->gb)) - s->pb_frame = 2; - if(get_bits(&s->gb, 5)) - av_log(s->avctx, AV_LOG_ERROR, "Bad value for reserved field\n"); - if(get_bits(&s->gb, 5) != 1) - av_log(s->avctx, AV_LOG_ERROR, "Invalid marker\n"); - } - if(format == 6){ - int ar = get_bits(&s->gb, 4); - skip_bits(&s->gb, 9); // display width - skip_bits1(&s->gb); - skip_bits(&s->gb, 9); // display height - if(ar == 15){ - skip_bits(&s->gb, 8); // aspect ratio - width - skip_bits(&s->gb, 8); // aspect ratio - height - } - } - - s->chroma_qscale= s->qscale = get_bits(&s->gb, 5); - skip_bits1(&s->gb); /* Continuous Presence Multipoint mode: off */ - - if(s->pb_frame){ - skip_bits(&s->gb, 3); //temporal reference for B-frame - skip_bits(&s->gb, 2); //dbquant - } - - /* PEI */ - while (get_bits1(&s->gb) != 0) { - skip_bits(&s->gb, 8); - } - s->f_code = 1; - - s->y_dc_scale_table= - s->c_dc_scale_table= ff_mpeg1_dc_scale_table; - - if(s->avctx->debug&FF_DEBUG_PICT_INFO) - show_pict_info(s); - - return 0; -}
--- a/h263dec.c Thu Jan 07 06:20:57 2010 +0000 +++ b/h263dec.c Thu Jan 07 06:25:41 2010 +0000 @@ -414,7 +414,7 @@ } ret = ff_mpeg4_decode_picture_header(s, &s->gb); } else if (s->codec_id == CODEC_ID_H263I) { - ret = intel_h263_decode_picture_header(s); + ret = ff_intel_h263_decode_picture_header(s); } else if (CONFIG_FLV_DECODER && s->h263_flv) { ret = ff_flv_decode_picture_header(s); } else { @@ -817,20 +817,6 @@ .pix_fmts= ff_pixfmt_list_420, }; -AVCodec h263i_decoder = { - "h263i", - CODEC_TYPE_VIDEO, - CODEC_ID_H263I, - sizeof(MpegEncContext), - ff_h263_decode_init, - NULL, - ff_h263_decode_end, - ff_h263_decode_frame, - CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1, - .long_name = NULL_IF_CONFIG_SMALL("Intel H.263"), - .pix_fmts= ff_pixfmt_list_420, -}; - #if CONFIG_MPEG4_VDPAU_DECODER AVCodec mpeg4_vdpau_decoder = { "mpeg4_vdpau",
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/intelh263dec.c Thu Jan 07 06:25:41 2010 +0000 @@ -0,0 +1,131 @@ +/* + * H.263i decoder + * + * This file is part of FFmpeg. + * + * FFmpeg 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, + * 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 + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "mpegvideo.h" + +/* don't understand why they choose a different header ! */ +int ff_intel_h263_decode_picture_header(MpegEncContext *s) +{ + int format; + + /* picture header */ + if (get_bits_long(&s->gb, 22) != 0x20) { + av_log(s->avctx, AV_LOG_ERROR, "Bad picture start code\n"); + return -1; + } + s->picture_number = get_bits(&s->gb, 8); /* picture timestamp */ + + if (get_bits1(&s->gb) != 1) { + av_log(s->avctx, AV_LOG_ERROR, "Bad marker\n"); + return -1; /* marker */ + } + if (get_bits1(&s->gb) != 0) { + av_log(s->avctx, AV_LOG_ERROR, "Bad H263 id\n"); + return -1; /* h263 id */ + } + skip_bits1(&s->gb); /* split screen off */ + skip_bits1(&s->gb); /* camera off */ + skip_bits1(&s->gb); /* freeze picture release off */ + + format = get_bits(&s->gb, 3); + if (format != 7) { + av_log(s->avctx, AV_LOG_ERROR, "Intel H263 free format not supported\n"); + return -1; + } + s->h263_plus = 0; + + s->pict_type = FF_I_TYPE + get_bits1(&s->gb); + + s->unrestricted_mv = get_bits1(&s->gb); + s->h263_long_vectors = s->unrestricted_mv; + + if (get_bits1(&s->gb) != 0) { + av_log(s->avctx, AV_LOG_ERROR, "SAC not supported\n"); + return -1; /* SAC: off */ + } + s->obmc= get_bits1(&s->gb); + s->pb_frame = get_bits1(&s->gb); + + if(format == 7){ + format = get_bits(&s->gb, 3); + if(format == 0 || format == 7){ + av_log(s->avctx, AV_LOG_ERROR, "Wrong Intel H263 format\n"); + return -1; + } + if(get_bits(&s->gb, 2)) + av_log(s->avctx, AV_LOG_ERROR, "Bad value for reserved field\n"); + s->loop_filter = get_bits1(&s->gb); + if(get_bits1(&s->gb)) + av_log(s->avctx, AV_LOG_ERROR, "Bad value for reserved field\n"); + if(get_bits1(&s->gb)) + s->pb_frame = 2; + if(get_bits(&s->gb, 5)) + av_log(s->avctx, AV_LOG_ERROR, "Bad value for reserved field\n"); + if(get_bits(&s->gb, 5) != 1) + av_log(s->avctx, AV_LOG_ERROR, "Invalid marker\n"); + } + if(format == 6){ + int ar = get_bits(&s->gb, 4); + skip_bits(&s->gb, 9); // display width + skip_bits1(&s->gb); + skip_bits(&s->gb, 9); // display height + if(ar == 15){ + skip_bits(&s->gb, 8); // aspect ratio - width + skip_bits(&s->gb, 8); // aspect ratio - height + } + } + + s->chroma_qscale= s->qscale = get_bits(&s->gb, 5); + skip_bits1(&s->gb); /* Continuous Presence Multipoint mode: off */ + + if(s->pb_frame){ + skip_bits(&s->gb, 3); //temporal reference for B-frame + skip_bits(&s->gb, 2); //dbquant + } + + /* PEI */ + while (get_bits1(&s->gb) != 0) { + skip_bits(&s->gb, 8); + } + s->f_code = 1; + + s->y_dc_scale_table= + s->c_dc_scale_table= ff_mpeg1_dc_scale_table; + + if(s->avctx->debug&FF_DEBUG_PICT_INFO) + ff_h263_show_pict_info(s); + + return 0; +} + +AVCodec h263i_decoder = { + "h263i", + CODEC_TYPE_VIDEO, + CODEC_ID_H263I, + sizeof(MpegEncContext), + ff_h263_decode_init, + NULL, + ff_h263_decode_end, + ff_h263_decode_frame, + CODEC_CAP_DRAW_HORIZ_BAND | CODEC_CAP_DR1, + .long_name = NULL_IF_CONFIG_SMALL("Intel H.263"), + .pix_fmts= ff_pixfmt_list_420, +}; +
--- a/mpegvideo.h Thu Jan 07 06:20:57 2010 +0000 +++ b/mpegvideo.h Thu Jan 07 06:25:41 2010 +0000 @@ -831,8 +831,9 @@ void ff_set_qscale(MpegEncContext * s, int qscale); int ff_h263_decode_mba(MpegEncContext *s); void ff_h263_encode_mba(MpegEncContext *s); +void ff_h263_show_pict_info(MpegEncContext *s); -int intel_h263_decode_picture_header(MpegEncContext *s); +int ff_intel_h263_decode_picture_header(MpegEncContext *s); int ff_h263_decode_mb(MpegEncContext *s, DCTELEM block[6][64]); int ff_mpeg4_decode_mb(MpegEncContext *s,