mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-12-23 12:43:46 +02:00
Split out intel H263 decoder.
Originally committed as revision 21054 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
parent
515a543809
commit
d7525cba23
@ -124,7 +124,7 @@ OBJS-$(CONFIG_H261_ENCODER) += h261enc.o h261.o \
|
||||
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 \
|
||||
|
@ -133,7 +133,7 @@ int h263_get_picture_format(int width, int height)
|
||||
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 @@ int h263_decode_picture_header(MpegEncContext *s)
|
||||
}
|
||||
|
||||
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 @@ end:
|
||||
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;
|
||||
}
|
||||
|
@ -414,7 +414,7 @@ retry:
|
||||
}
|
||||
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 @@ AVCodec wmv1_decoder = {
|
||||
.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",
|
||||
|
131
libavcodec/intelh263dec.c
Normal file
131
libavcodec/intelh263dec.c
Normal file
@ -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,
|
||||
};
|
||||
|
@ -831,8 +831,9 @@ void ff_h263_loop_filter(MpegEncContext * s);
|
||||
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,
|
||||
|
Loading…
Reference in New Issue
Block a user