976a8b2179
* qatar/master: (40 commits) H.264: template left MB handling H.264: faster fill_decode_caches H.264: faster write_back_* H.264: faster fill_filter_caches H.264: make filter_mb_fast support the case of unavailable top mb Do not include log.h in avutil.h Do not include pixfmt.h in avutil.h Do not include rational.h in avutil.h Do not include mathematics.h in avutil.h Do not include intfloat_readwrite.h in avutil.h Remove return statements following infinite loops without break RTSP: Doxygen comment cleanup doxygen: Escape '\' in Doxygen documentation. md5: cosmetics md5: use AV_WL32 to write result md5: add fate test md5: include correct headers md5: fix test program doxygen: Drop array size declarations from Doxygen parameter names. doxygen: Fix parameter names to match the function prototypes. ... Conflicts: libavcodec/x86/dsputil_mmx.c libavformat/flvenc.c libavformat/oggenc.c libavformat/wtv.c Merged-by: Michael Niedermayer <michaelni@gmx.at>
1133 lines
36 KiB
C
1133 lines
36 KiB
C
/*
|
|
* ITU H263 bitstream decoder
|
|
* Copyright (c) 2000,2001 Fabrice Bellard
|
|
* H263+ support.
|
|
* Copyright (c) 2001 Juan J. Sierralta P
|
|
* Copyright (c) 2002-2004 Michael Niedermayer <michaelni@gmx.at>
|
|
*
|
|
* 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
|
|
*/
|
|
|
|
/**
|
|
* @file
|
|
* h263 decoder.
|
|
*/
|
|
|
|
//#define DEBUG
|
|
#include <limits.h>
|
|
|
|
#include "libavutil/mathematics.h"
|
|
#include "dsputil.h"
|
|
#include "avcodec.h"
|
|
#include "mpegvideo.h"
|
|
#include "h263.h"
|
|
#include "mathops.h"
|
|
#include "unary.h"
|
|
#include "flv.h"
|
|
#include "mpeg4video.h"
|
|
|
|
//#undef NDEBUG
|
|
//#include <assert.h>
|
|
|
|
// The defines below define the number of bits that are read at once for
|
|
// reading vlc values. Changing these may improve speed and data cache needs
|
|
// be aware though that decreasing them may need the number of stages that is
|
|
// passed to get_vlc* to be increased.
|
|
#define MV_VLC_BITS 9
|
|
#define H263_MBTYPE_B_VLC_BITS 6
|
|
#define CBPC_B_VLC_BITS 3
|
|
|
|
static const int h263_mb_type_b_map[15]= {
|
|
MB_TYPE_DIRECT2 | MB_TYPE_L0L1,
|
|
MB_TYPE_DIRECT2 | MB_TYPE_L0L1 | MB_TYPE_CBP,
|
|
MB_TYPE_DIRECT2 | MB_TYPE_L0L1 | MB_TYPE_CBP | MB_TYPE_QUANT,
|
|
MB_TYPE_L0 | MB_TYPE_16x16,
|
|
MB_TYPE_L0 | MB_TYPE_CBP | MB_TYPE_16x16,
|
|
MB_TYPE_L0 | MB_TYPE_CBP | MB_TYPE_QUANT | MB_TYPE_16x16,
|
|
MB_TYPE_L1 | MB_TYPE_16x16,
|
|
MB_TYPE_L1 | MB_TYPE_CBP | MB_TYPE_16x16,
|
|
MB_TYPE_L1 | MB_TYPE_CBP | MB_TYPE_QUANT | MB_TYPE_16x16,
|
|
MB_TYPE_L0L1 | MB_TYPE_16x16,
|
|
MB_TYPE_L0L1 | MB_TYPE_CBP | MB_TYPE_16x16,
|
|
MB_TYPE_L0L1 | MB_TYPE_CBP | MB_TYPE_QUANT | MB_TYPE_16x16,
|
|
0, //stuffing
|
|
MB_TYPE_INTRA4x4 | MB_TYPE_CBP,
|
|
MB_TYPE_INTRA4x4 | MB_TYPE_CBP | MB_TYPE_QUANT,
|
|
};
|
|
|
|
void ff_h263_show_pict_info(MpegEncContext *s){
|
|
if(s->avctx->debug&FF_DEBUG_PICT_INFO){
|
|
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_picture_type_char(s->pict_type),
|
|
s->gb.size_in_bits, 1-s->no_rounding,
|
|
s->obmc ? " AP" : "",
|
|
s->umvplus ? " UMV" : "",
|
|
s->h263_long_vectors ? " LONG" : "",
|
|
s->h263_plus ? " +" : "",
|
|
s->h263_aic ? " AIC" : "",
|
|
s->alt_inter_vlc ? " AIV" : "",
|
|
s->modified_quant ? " MQ" : "",
|
|
s->loop_filter ? " LOOP" : "",
|
|
s->h263_slice_structured ? " SS" : "",
|
|
s->avctx->time_base.den, s->avctx->time_base.num
|
|
);
|
|
}
|
|
}
|
|
|
|
/***********************************************/
|
|
/* decoding */
|
|
|
|
VLC ff_h263_intra_MCBPC_vlc;
|
|
VLC ff_h263_inter_MCBPC_vlc;
|
|
VLC ff_h263_cbpy_vlc;
|
|
static VLC mv_vlc;
|
|
static VLC h263_mbtype_b_vlc;
|
|
static VLC cbpc_b_vlc;
|
|
|
|
/* init vlcs */
|
|
|
|
/* XXX: find a better solution to handle static init */
|
|
void h263_decode_init_vlc(MpegEncContext *s)
|
|
{
|
|
static int done = 0;
|
|
|
|
if (!done) {
|
|
done = 1;
|
|
|
|
INIT_VLC_STATIC(&ff_h263_intra_MCBPC_vlc, INTRA_MCBPC_VLC_BITS, 9,
|
|
ff_h263_intra_MCBPC_bits, 1, 1,
|
|
ff_h263_intra_MCBPC_code, 1, 1, 72);
|
|
INIT_VLC_STATIC(&ff_h263_inter_MCBPC_vlc, INTER_MCBPC_VLC_BITS, 28,
|
|
ff_h263_inter_MCBPC_bits, 1, 1,
|
|
ff_h263_inter_MCBPC_code, 1, 1, 198);
|
|
INIT_VLC_STATIC(&ff_h263_cbpy_vlc, CBPY_VLC_BITS, 16,
|
|
&ff_h263_cbpy_tab[0][1], 2, 1,
|
|
&ff_h263_cbpy_tab[0][0], 2, 1, 64);
|
|
INIT_VLC_STATIC(&mv_vlc, MV_VLC_BITS, 33,
|
|
&mvtab[0][1], 2, 1,
|
|
&mvtab[0][0], 2, 1, 538);
|
|
init_rl(&ff_h263_rl_inter, ff_h263_static_rl_table_store[0]);
|
|
init_rl(&rl_intra_aic, ff_h263_static_rl_table_store[1]);
|
|
INIT_VLC_RL(ff_h263_rl_inter, 554);
|
|
INIT_VLC_RL(rl_intra_aic, 554);
|
|
INIT_VLC_STATIC(&h263_mbtype_b_vlc, H263_MBTYPE_B_VLC_BITS, 15,
|
|
&h263_mbtype_b_tab[0][1], 2, 1,
|
|
&h263_mbtype_b_tab[0][0], 2, 1, 80);
|
|
INIT_VLC_STATIC(&cbpc_b_vlc, CBPC_B_VLC_BITS, 4,
|
|
&cbpc_b_tab[0][1], 2, 1,
|
|
&cbpc_b_tab[0][0], 2, 1, 8);
|
|
}
|
|
}
|
|
|
|
int ff_h263_decode_mba(MpegEncContext *s)
|
|
{
|
|
int i, mb_pos;
|
|
|
|
for(i=0; i<6; i++){
|
|
if(s->mb_num-1 <= ff_mba_max[i]) break;
|
|
}
|
|
mb_pos= get_bits(&s->gb, ff_mba_length[i]);
|
|
s->mb_x= mb_pos % s->mb_width;
|
|
s->mb_y= mb_pos / s->mb_width;
|
|
|
|
return mb_pos;
|
|
}
|
|
|
|
/**
|
|
* decodes the group of blocks header or slice header.
|
|
* @return <0 if an error occurred
|
|
*/
|
|
static int h263_decode_gob_header(MpegEncContext *s)
|
|
{
|
|
unsigned int val, gob_number;
|
|
int left;
|
|
|
|
/* Check for GOB Start Code */
|
|
val = show_bits(&s->gb, 16);
|
|
if(val)
|
|
return -1;
|
|
|
|
/* We have a GBSC probably with GSTUFF */
|
|
skip_bits(&s->gb, 16); /* Drop the zeros */
|
|
left= get_bits_left(&s->gb);
|
|
//MN: we must check the bits left or we might end in a infinite loop (or segfault)
|
|
for(;left>13; left--){
|
|
if(get_bits1(&s->gb)) break; /* Seek the '1' bit */
|
|
}
|
|
if(left<=13)
|
|
return -1;
|
|
|
|
if(s->h263_slice_structured){
|
|
if(get_bits1(&s->gb)==0)
|
|
return -1;
|
|
|
|
ff_h263_decode_mba(s);
|
|
|
|
if(s->mb_num > 1583)
|
|
if(get_bits1(&s->gb)==0)
|
|
return -1;
|
|
|
|
s->qscale = get_bits(&s->gb, 5); /* SQUANT */
|
|
if(get_bits1(&s->gb)==0)
|
|
return -1;
|
|
skip_bits(&s->gb, 2); /* GFID */
|
|
}else{
|
|
gob_number = get_bits(&s->gb, 5); /* GN */
|
|
s->mb_x= 0;
|
|
s->mb_y= s->gob_index* gob_number;
|
|
skip_bits(&s->gb, 2); /* GFID */
|
|
s->qscale = get_bits(&s->gb, 5); /* GQUANT */
|
|
}
|
|
|
|
if(s->mb_y >= s->mb_height)
|
|
return -1;
|
|
|
|
if(s->qscale==0)
|
|
return -1;
|
|
|
|
return 0;
|
|
}
|
|
|
|
/**
|
|
* finds the next resync_marker
|
|
* @param p pointer to buffer to scan
|
|
* @param end pointer to the end of the buffer
|
|
* @return pointer to the next resync_marker, or end if none was found
|
|
*/
|
|
const uint8_t *ff_h263_find_resync_marker(const uint8_t *restrict p, const uint8_t * restrict end)
|
|
{
|
|
assert(p < end);
|
|
|
|
end-=2;
|
|
p++;
|
|
for(;p<end; p+=2){
|
|
if(!*p){
|
|
if (!p[-1] && p[1]) return p - 1;
|
|
else if(!p[ 1] && p[2]) return p;
|
|
}
|
|
}
|
|
return end+2;
|
|
}
|
|
|
|
/**
|
|
* decodes the group of blocks / video packet header.
|
|
* @return bit position of the resync_marker, or <0 if none was found
|
|
*/
|
|
int ff_h263_resync(MpegEncContext *s){
|
|
int left, pos, ret;
|
|
|
|
if(s->codec_id==CODEC_ID_MPEG4){
|
|
skip_bits1(&s->gb);
|
|
align_get_bits(&s->gb);
|
|
}
|
|
|
|
if(show_bits(&s->gb, 16)==0){
|
|
pos= get_bits_count(&s->gb);
|
|
if(CONFIG_MPEG4_DECODER && s->codec_id==CODEC_ID_MPEG4)
|
|
ret= mpeg4_decode_video_packet_header(s);
|
|
else
|
|
ret= h263_decode_gob_header(s);
|
|
if(ret>=0)
|
|
return pos;
|
|
}
|
|
//OK, it's not where it is supposed to be ...
|
|
s->gb= s->last_resync_gb;
|
|
align_get_bits(&s->gb);
|
|
left= get_bits_left(&s->gb);
|
|
|
|
for(;left>16+1+5+5; left-=8){
|
|
if(show_bits(&s->gb, 16)==0){
|
|
GetBitContext bak= s->gb;
|
|
|
|
pos= get_bits_count(&s->gb);
|
|
if(CONFIG_MPEG4_DECODER && s->codec_id==CODEC_ID_MPEG4)
|
|
ret= mpeg4_decode_video_packet_header(s);
|
|
else
|
|
ret= h263_decode_gob_header(s);
|
|
if(ret>=0)
|
|
return pos;
|
|
|
|
s->gb= bak;
|
|
}
|
|
skip_bits(&s->gb, 8);
|
|
}
|
|
|
|
return -1;
|
|
}
|
|
|
|
int h263_decode_motion(MpegEncContext * s, int pred, int f_code)
|
|
{
|
|
int code, val, sign, shift, l;
|
|
code = get_vlc2(&s->gb, mv_vlc.table, MV_VLC_BITS, 2);
|
|
|
|
if (code == 0)
|
|
return pred;
|
|
if (code < 0)
|
|
return 0xffff;
|
|
|
|
sign = get_bits1(&s->gb);
|
|
shift = f_code - 1;
|
|
val = code;
|
|
if (shift) {
|
|
val = (val - 1) << shift;
|
|
val |= get_bits(&s->gb, shift);
|
|
val++;
|
|
}
|
|
if (sign)
|
|
val = -val;
|
|
val += pred;
|
|
|
|
/* modulo decoding */
|
|
if (!s->h263_long_vectors) {
|
|
l = INT_BIT - 5 - f_code;
|
|
val = (val<<l)>>l;
|
|
} else {
|
|
/* horrible h263 long vector mode */
|
|
if (pred < -31 && val < -63)
|
|
val += 64;
|
|
if (pred > 32 && val > 63)
|
|
val -= 64;
|
|
|
|
}
|
|
return val;
|
|
}
|
|
|
|
|
|
/* Decodes RVLC of H.263+ UMV */
|
|
static int h263p_decode_umotion(MpegEncContext * s, int pred)
|
|
{
|
|
int code = 0, sign;
|
|
|
|
if (get_bits1(&s->gb)) /* Motion difference = 0 */
|
|
return pred;
|
|
|
|
code = 2 + get_bits1(&s->gb);
|
|
|
|
while (get_bits1(&s->gb))
|
|
{
|
|
code <<= 1;
|
|
code += get_bits1(&s->gb);
|
|
}
|
|
sign = code & 1;
|
|
code >>= 1;
|
|
|
|
code = (sign) ? (pred - code) : (pred + code);
|
|
av_dlog(s->avctx,"H.263+ UMV Motion = %d\n", code);
|
|
return code;
|
|
|
|
}
|
|
|
|
/**
|
|
* read the next MVs for OBMC. yes this is a ugly hack, feel free to send a patch :)
|
|
*/
|
|
static void preview_obmc(MpegEncContext *s){
|
|
GetBitContext gb= s->gb;
|
|
|
|
int cbpc, i, pred_x, pred_y, mx, my;
|
|
int16_t *mot_val;
|
|
const int xy= s->mb_x + 1 + s->mb_y * s->mb_stride;
|
|
const int stride= s->b8_stride*2;
|
|
|
|
for(i=0; i<4; i++)
|
|
s->block_index[i]+= 2;
|
|
for(i=4; i<6; i++)
|
|
s->block_index[i]+= 1;
|
|
s->mb_x++;
|
|
|
|
assert(s->pict_type == AV_PICTURE_TYPE_P);
|
|
|
|
do{
|
|
if (get_bits1(&s->gb)) {
|
|
/* skip mb */
|
|
mot_val = s->current_picture.motion_val[0][ s->block_index[0] ];
|
|
mot_val[0 ]= mot_val[2 ]=
|
|
mot_val[0+stride]= mot_val[2+stride]= 0;
|
|
mot_val[1 ]= mot_val[3 ]=
|
|
mot_val[1+stride]= mot_val[3+stride]= 0;
|
|
|
|
s->current_picture.mb_type[xy]= MB_TYPE_SKIP | MB_TYPE_16x16 | MB_TYPE_L0;
|
|
goto end;
|
|
}
|
|
cbpc = get_vlc2(&s->gb, ff_h263_inter_MCBPC_vlc.table, INTER_MCBPC_VLC_BITS, 2);
|
|
}while(cbpc == 20);
|
|
|
|
if(cbpc & 4){
|
|
s->current_picture.mb_type[xy]= MB_TYPE_INTRA;
|
|
}else{
|
|
get_vlc2(&s->gb, ff_h263_cbpy_vlc.table, CBPY_VLC_BITS, 1);
|
|
if (cbpc & 8) {
|
|
if(s->modified_quant){
|
|
if(get_bits1(&s->gb)) skip_bits(&s->gb, 1);
|
|
else skip_bits(&s->gb, 5);
|
|
}else
|
|
skip_bits(&s->gb, 2);
|
|
}
|
|
|
|
if ((cbpc & 16) == 0) {
|
|
s->current_picture.mb_type[xy]= MB_TYPE_16x16 | MB_TYPE_L0;
|
|
/* 16x16 motion prediction */
|
|
mot_val= h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
|
|
if (s->umvplus)
|
|
mx = h263p_decode_umotion(s, pred_x);
|
|
else
|
|
mx = h263_decode_motion(s, pred_x, 1);
|
|
|
|
if (s->umvplus)
|
|
my = h263p_decode_umotion(s, pred_y);
|
|
else
|
|
my = h263_decode_motion(s, pred_y, 1);
|
|
|
|
mot_val[0 ]= mot_val[2 ]=
|
|
mot_val[0+stride]= mot_val[2+stride]= mx;
|
|
mot_val[1 ]= mot_val[3 ]=
|
|
mot_val[1+stride]= mot_val[3+stride]= my;
|
|
} else {
|
|
s->current_picture.mb_type[xy]= MB_TYPE_8x8 | MB_TYPE_L0;
|
|
for(i=0;i<4;i++) {
|
|
mot_val = h263_pred_motion(s, i, 0, &pred_x, &pred_y);
|
|
if (s->umvplus)
|
|
mx = h263p_decode_umotion(s, pred_x);
|
|
else
|
|
mx = h263_decode_motion(s, pred_x, 1);
|
|
|
|
if (s->umvplus)
|
|
my = h263p_decode_umotion(s, pred_y);
|
|
else
|
|
my = h263_decode_motion(s, pred_y, 1);
|
|
if (s->umvplus && (mx - pred_x) == 1 && (my - pred_y) == 1)
|
|
skip_bits1(&s->gb); /* Bit stuffing to prevent PSC */
|
|
mot_val[0] = mx;
|
|
mot_val[1] = my;
|
|
}
|
|
}
|
|
}
|
|
end:
|
|
|
|
for(i=0; i<4; i++)
|
|
s->block_index[i]-= 2;
|
|
for(i=4; i<6; i++)
|
|
s->block_index[i]-= 1;
|
|
s->mb_x--;
|
|
|
|
s->gb= gb;
|
|
}
|
|
|
|
static void h263_decode_dquant(MpegEncContext *s){
|
|
static const int8_t quant_tab[4] = { -1, -2, 1, 2 };
|
|
|
|
if(s->modified_quant){
|
|
if(get_bits1(&s->gb))
|
|
s->qscale= modified_quant_tab[get_bits1(&s->gb)][ s->qscale ];
|
|
else
|
|
s->qscale= get_bits(&s->gb, 5);
|
|
}else
|
|
s->qscale += quant_tab[get_bits(&s->gb, 2)];
|
|
ff_set_qscale(s, s->qscale);
|
|
}
|
|
|
|
static int h263_decode_block(MpegEncContext * s, DCTELEM * block,
|
|
int n, int coded)
|
|
{
|
|
int code, level, i, j, last, run;
|
|
RLTable *rl = &ff_h263_rl_inter;
|
|
const uint8_t *scan_table;
|
|
GetBitContext gb= s->gb;
|
|
|
|
scan_table = s->intra_scantable.permutated;
|
|
if (s->h263_aic && s->mb_intra) {
|
|
rl = &rl_intra_aic;
|
|
i = 0;
|
|
if (s->ac_pred) {
|
|
if (s->h263_aic_dir)
|
|
scan_table = s->intra_v_scantable.permutated; /* left */
|
|
else
|
|
scan_table = s->intra_h_scantable.permutated; /* top */
|
|
}
|
|
} else if (s->mb_intra) {
|
|
/* DC coef */
|
|
if(s->codec_id == CODEC_ID_RV10){
|
|
#if CONFIG_RV10_DECODER
|
|
if (s->rv10_version == 3 && s->pict_type == AV_PICTURE_TYPE_I) {
|
|
int component, diff;
|
|
component = (n <= 3 ? 0 : n - 4 + 1);
|
|
level = s->last_dc[component];
|
|
if (s->rv10_first_dc_coded[component]) {
|
|
diff = rv_decode_dc(s, n);
|
|
if (diff == 0xffff)
|
|
return -1;
|
|
level += diff;
|
|
level = level & 0xff; /* handle wrap round */
|
|
s->last_dc[component] = level;
|
|
} else {
|
|
s->rv10_first_dc_coded[component] = 1;
|
|
}
|
|
} else {
|
|
level = get_bits(&s->gb, 8);
|
|
if (level == 255)
|
|
level = 128;
|
|
}
|
|
#endif
|
|
}else{
|
|
level = get_bits(&s->gb, 8);
|
|
if((level&0x7F) == 0){
|
|
av_log(s->avctx, AV_LOG_ERROR, "illegal dc %d at %d %d\n", level, s->mb_x, s->mb_y);
|
|
if(s->error_recognition >= FF_ER_COMPLIANT)
|
|
return -1;
|
|
}
|
|
if (level == 255)
|
|
level = 128;
|
|
}
|
|
block[0] = level;
|
|
i = 1;
|
|
} else {
|
|
i = 0;
|
|
}
|
|
if (!coded) {
|
|
if (s->mb_intra && s->h263_aic)
|
|
goto not_coded;
|
|
s->block_last_index[n] = i - 1;
|
|
return 0;
|
|
}
|
|
retry:
|
|
for(;;) {
|
|
code = get_vlc2(&s->gb, rl->vlc.table, TEX_VLC_BITS, 2);
|
|
if (code < 0){
|
|
av_log(s->avctx, AV_LOG_ERROR, "illegal ac vlc code at %dx%d\n", s->mb_x, s->mb_y);
|
|
return -1;
|
|
}
|
|
if (code == rl->n) {
|
|
/* escape */
|
|
if (CONFIG_FLV_DECODER && s->h263_flv > 1) {
|
|
ff_flv2_decode_ac_esc(&s->gb, &level, &run, &last);
|
|
} else {
|
|
last = get_bits1(&s->gb);
|
|
run = get_bits(&s->gb, 6);
|
|
level = (int8_t)get_bits(&s->gb, 8);
|
|
if(level == -128){
|
|
if (s->codec_id == CODEC_ID_RV10) {
|
|
/* XXX: should patch encoder too */
|
|
level = get_sbits(&s->gb, 12);
|
|
}else{
|
|
level = get_bits(&s->gb, 5);
|
|
level |= get_sbits(&s->gb, 6)<<5;
|
|
}
|
|
}
|
|
}
|
|
} else {
|
|
run = rl->table_run[code];
|
|
level = rl->table_level[code];
|
|
last = code >= rl->last;
|
|
if (get_bits1(&s->gb))
|
|
level = -level;
|
|
}
|
|
i += run;
|
|
if (i >= 64){
|
|
if(s->alt_inter_vlc && rl == &ff_h263_rl_inter && !s->mb_intra){
|
|
//Looks like a hack but no, it's the way it is supposed to work ...
|
|
rl = &rl_intra_aic;
|
|
i = 0;
|
|
s->gb= gb;
|
|
s->dsp.clear_block(block);
|
|
goto retry;
|
|
}
|
|
av_log(s->avctx, AV_LOG_ERROR, "run overflow at %dx%d i:%d\n", s->mb_x, s->mb_y, s->mb_intra);
|
|
return -1;
|
|
}
|
|
j = scan_table[i];
|
|
block[j] = level;
|
|
if (last)
|
|
break;
|
|
i++;
|
|
}
|
|
not_coded:
|
|
if (s->mb_intra && s->h263_aic) {
|
|
h263_pred_acdc(s, block, n);
|
|
i = 63;
|
|
}
|
|
s->block_last_index[n] = i;
|
|
return 0;
|
|
}
|
|
|
|
static int h263_skip_b_part(MpegEncContext *s, int cbp)
|
|
{
|
|
LOCAL_ALIGNED_16(DCTELEM, dblock, [64]);
|
|
int i, mbi;
|
|
|
|
/* we have to set s->mb_intra to zero to decode B-part of PB-frame correctly
|
|
* but real value should be restored in order to be used later (in OBMC condition)
|
|
*/
|
|
mbi = s->mb_intra;
|
|
s->mb_intra = 0;
|
|
for (i = 0; i < 6; i++) {
|
|
if (h263_decode_block(s, dblock, i, cbp&32) < 0)
|
|
return -1;
|
|
cbp+=cbp;
|
|
}
|
|
s->mb_intra = mbi;
|
|
return 0;
|
|
}
|
|
|
|
static int h263_get_modb(GetBitContext *gb, int pb_frame, int *cbpb)
|
|
{
|
|
int c, mv = 1;
|
|
|
|
if (pb_frame < 3) { // h.263 Annex G and i263 PB-frame
|
|
c = get_bits1(gb);
|
|
if (pb_frame == 2 && c)
|
|
mv = !get_bits1(gb);
|
|
} else { // h.263 Annex M improved PB-frame
|
|
mv = get_unary(gb, 0, 4) + 1;
|
|
c = mv & 1;
|
|
mv = !!(mv & 2);
|
|
}
|
|
if(c)
|
|
*cbpb = get_bits(gb, 6);
|
|
return mv;
|
|
}
|
|
|
|
int ff_h263_decode_mb(MpegEncContext *s,
|
|
DCTELEM block[6][64])
|
|
{
|
|
int cbpc, cbpy, i, cbp, pred_x, pred_y, mx, my, dquant;
|
|
int16_t *mot_val;
|
|
const int xy= s->mb_x + s->mb_y * s->mb_stride;
|
|
int cbpb = 0, pb_mv_count = 0;
|
|
|
|
assert(!s->h263_pred);
|
|
|
|
if (s->pict_type == AV_PICTURE_TYPE_P) {
|
|
do{
|
|
if (get_bits1(&s->gb)) {
|
|
/* skip mb */
|
|
s->mb_intra = 0;
|
|
for(i=0;i<6;i++)
|
|
s->block_last_index[i] = -1;
|
|
s->mv_dir = MV_DIR_FORWARD;
|
|
s->mv_type = MV_TYPE_16X16;
|
|
s->current_picture.mb_type[xy]= MB_TYPE_SKIP | MB_TYPE_16x16 | MB_TYPE_L0;
|
|
s->mv[0][0][0] = 0;
|
|
s->mv[0][0][1] = 0;
|
|
s->mb_skipped = !(s->obmc | s->loop_filter);
|
|
goto end;
|
|
}
|
|
cbpc = get_vlc2(&s->gb, ff_h263_inter_MCBPC_vlc.table, INTER_MCBPC_VLC_BITS, 2);
|
|
if (cbpc < 0){
|
|
av_log(s->avctx, AV_LOG_ERROR, "cbpc damaged at %d %d\n", s->mb_x, s->mb_y);
|
|
return -1;
|
|
}
|
|
}while(cbpc == 20);
|
|
|
|
s->dsp.clear_blocks(s->block[0]);
|
|
|
|
dquant = cbpc & 8;
|
|
s->mb_intra = ((cbpc & 4) != 0);
|
|
if (s->mb_intra) goto intra;
|
|
|
|
if(s->pb_frame && get_bits1(&s->gb))
|
|
pb_mv_count = h263_get_modb(&s->gb, s->pb_frame, &cbpb);
|
|
cbpy = get_vlc2(&s->gb, ff_h263_cbpy_vlc.table, CBPY_VLC_BITS, 1);
|
|
|
|
if(s->alt_inter_vlc==0 || (cbpc & 3)!=3)
|
|
cbpy ^= 0xF;
|
|
|
|
cbp = (cbpc & 3) | (cbpy << 2);
|
|
if (dquant) {
|
|
h263_decode_dquant(s);
|
|
}
|
|
|
|
s->mv_dir = MV_DIR_FORWARD;
|
|
if ((cbpc & 16) == 0) {
|
|
s->current_picture.mb_type[xy]= MB_TYPE_16x16 | MB_TYPE_L0;
|
|
/* 16x16 motion prediction */
|
|
s->mv_type = MV_TYPE_16X16;
|
|
h263_pred_motion(s, 0, 0, &pred_x, &pred_y);
|
|
if (s->umvplus)
|
|
mx = h263p_decode_umotion(s, pred_x);
|
|
else
|
|
mx = h263_decode_motion(s, pred_x, 1);
|
|
|
|
if (mx >= 0xffff)
|
|
return -1;
|
|
|
|
if (s->umvplus)
|
|
my = h263p_decode_umotion(s, pred_y);
|
|
else
|
|
my = h263_decode_motion(s, pred_y, 1);
|
|
|
|
if (my >= 0xffff)
|
|
return -1;
|
|
s->mv[0][0][0] = mx;
|
|
s->mv[0][0][1] = my;
|
|
|
|
if (s->umvplus && (mx - pred_x) == 1 && (my - pred_y) == 1)
|
|
skip_bits1(&s->gb); /* Bit stuffing to prevent PSC */
|
|
} else {
|
|
s->current_picture.mb_type[xy]= MB_TYPE_8x8 | MB_TYPE_L0;
|
|
s->mv_type = MV_TYPE_8X8;
|
|
for(i=0;i<4;i++) {
|
|
mot_val = h263_pred_motion(s, i, 0, &pred_x, &pred_y);
|
|
if (s->umvplus)
|
|
mx = h263p_decode_umotion(s, pred_x);
|
|
else
|
|
mx = h263_decode_motion(s, pred_x, 1);
|
|
if (mx >= 0xffff)
|
|
return -1;
|
|
|
|
if (s->umvplus)
|
|
my = h263p_decode_umotion(s, pred_y);
|
|
else
|
|
my = h263_decode_motion(s, pred_y, 1);
|
|
if (my >= 0xffff)
|
|
return -1;
|
|
s->mv[0][i][0] = mx;
|
|
s->mv[0][i][1] = my;
|
|
if (s->umvplus && (mx - pred_x) == 1 && (my - pred_y) == 1)
|
|
skip_bits1(&s->gb); /* Bit stuffing to prevent PSC */
|
|
mot_val[0] = mx;
|
|
mot_val[1] = my;
|
|
}
|
|
}
|
|
} else if(s->pict_type==AV_PICTURE_TYPE_B) {
|
|
int mb_type;
|
|
const int stride= s->b8_stride;
|
|
int16_t *mot_val0 = s->current_picture.motion_val[0][ 2*(s->mb_x + s->mb_y*stride) ];
|
|
int16_t *mot_val1 = s->current_picture.motion_val[1][ 2*(s->mb_x + s->mb_y*stride) ];
|
|
// const int mv_xy= s->mb_x + 1 + s->mb_y * s->mb_stride;
|
|
|
|
//FIXME ugly
|
|
mot_val0[0 ]= mot_val0[2 ]= mot_val0[0+2*stride]= mot_val0[2+2*stride]=
|
|
mot_val0[1 ]= mot_val0[3 ]= mot_val0[1+2*stride]= mot_val0[3+2*stride]=
|
|
mot_val1[0 ]= mot_val1[2 ]= mot_val1[0+2*stride]= mot_val1[2+2*stride]=
|
|
mot_val1[1 ]= mot_val1[3 ]= mot_val1[1+2*stride]= mot_val1[3+2*stride]= 0;
|
|
|
|
do{
|
|
mb_type= get_vlc2(&s->gb, h263_mbtype_b_vlc.table, H263_MBTYPE_B_VLC_BITS, 2);
|
|
if (mb_type < 0){
|
|
av_log(s->avctx, AV_LOG_ERROR, "b mb_type damaged at %d %d\n", s->mb_x, s->mb_y);
|
|
return -1;
|
|
}
|
|
|
|
mb_type= h263_mb_type_b_map[ mb_type ];
|
|
}while(!mb_type);
|
|
|
|
s->mb_intra = IS_INTRA(mb_type);
|
|
if(HAS_CBP(mb_type)){
|
|
s->dsp.clear_blocks(s->block[0]);
|
|
cbpc = get_vlc2(&s->gb, cbpc_b_vlc.table, CBPC_B_VLC_BITS, 1);
|
|
if(s->mb_intra){
|
|
dquant = IS_QUANT(mb_type);
|
|
goto intra;
|
|
}
|
|
|
|
cbpy = get_vlc2(&s->gb, ff_h263_cbpy_vlc.table, CBPY_VLC_BITS, 1);
|
|
|
|
if (cbpy < 0){
|
|
av_log(s->avctx, AV_LOG_ERROR, "b cbpy damaged at %d %d\n", s->mb_x, s->mb_y);
|
|
return -1;
|
|
}
|
|
|
|
if(s->alt_inter_vlc==0 || (cbpc & 3)!=3)
|
|
cbpy ^= 0xF;
|
|
|
|
cbp = (cbpc & 3) | (cbpy << 2);
|
|
}else
|
|
cbp=0;
|
|
|
|
assert(!s->mb_intra);
|
|
|
|
if(IS_QUANT(mb_type)){
|
|
h263_decode_dquant(s);
|
|
}
|
|
|
|
if(IS_DIRECT(mb_type)){
|
|
s->mv_dir = MV_DIR_FORWARD | MV_DIR_BACKWARD | MV_DIRECT;
|
|
mb_type |= ff_mpeg4_set_direct_mv(s, 0, 0);
|
|
}else{
|
|
s->mv_dir = 0;
|
|
s->mv_type= MV_TYPE_16X16;
|
|
//FIXME UMV
|
|
|
|
if(USES_LIST(mb_type, 0)){
|
|
int16_t *mot_val= h263_pred_motion(s, 0, 0, &mx, &my);
|
|
s->mv_dir = MV_DIR_FORWARD;
|
|
|
|
mx = h263_decode_motion(s, mx, 1);
|
|
my = h263_decode_motion(s, my, 1);
|
|
|
|
s->mv[0][0][0] = mx;
|
|
s->mv[0][0][1] = my;
|
|
mot_val[0 ]= mot_val[2 ]= mot_val[0+2*stride]= mot_val[2+2*stride]= mx;
|
|
mot_val[1 ]= mot_val[3 ]= mot_val[1+2*stride]= mot_val[3+2*stride]= my;
|
|
}
|
|
|
|
if(USES_LIST(mb_type, 1)){
|
|
int16_t *mot_val= h263_pred_motion(s, 0, 1, &mx, &my);
|
|
s->mv_dir |= MV_DIR_BACKWARD;
|
|
|
|
mx = h263_decode_motion(s, mx, 1);
|
|
my = h263_decode_motion(s, my, 1);
|
|
|
|
s->mv[1][0][0] = mx;
|
|
s->mv[1][0][1] = my;
|
|
mot_val[0 ]= mot_val[2 ]= mot_val[0+2*stride]= mot_val[2+2*stride]= mx;
|
|
mot_val[1 ]= mot_val[3 ]= mot_val[1+2*stride]= mot_val[3+2*stride]= my;
|
|
}
|
|
}
|
|
|
|
s->current_picture.mb_type[xy]= mb_type;
|
|
} else { /* I-Frame */
|
|
do{
|
|
cbpc = get_vlc2(&s->gb, ff_h263_intra_MCBPC_vlc.table, INTRA_MCBPC_VLC_BITS, 2);
|
|
if (cbpc < 0){
|
|
av_log(s->avctx, AV_LOG_ERROR, "I cbpc damaged at %d %d\n", s->mb_x, s->mb_y);
|
|
return -1;
|
|
}
|
|
}while(cbpc == 8);
|
|
|
|
s->dsp.clear_blocks(s->block[0]);
|
|
|
|
dquant = cbpc & 4;
|
|
s->mb_intra = 1;
|
|
intra:
|
|
s->current_picture.mb_type[xy]= MB_TYPE_INTRA;
|
|
if (s->h263_aic) {
|
|
s->ac_pred = get_bits1(&s->gb);
|
|
if(s->ac_pred){
|
|
s->current_picture.mb_type[xy]= MB_TYPE_INTRA | MB_TYPE_ACPRED;
|
|
|
|
s->h263_aic_dir = get_bits1(&s->gb);
|
|
}
|
|
}else
|
|
s->ac_pred = 0;
|
|
|
|
if(s->pb_frame && get_bits1(&s->gb))
|
|
pb_mv_count = h263_get_modb(&s->gb, s->pb_frame, &cbpb);
|
|
cbpy = get_vlc2(&s->gb, ff_h263_cbpy_vlc.table, CBPY_VLC_BITS, 1);
|
|
if(cbpy<0){
|
|
av_log(s->avctx, AV_LOG_ERROR, "I cbpy damaged at %d %d\n", s->mb_x, s->mb_y);
|
|
return -1;
|
|
}
|
|
cbp = (cbpc & 3) | (cbpy << 2);
|
|
if (dquant) {
|
|
h263_decode_dquant(s);
|
|
}
|
|
|
|
pb_mv_count += !!s->pb_frame;
|
|
}
|
|
|
|
while(pb_mv_count--){
|
|
h263_decode_motion(s, 0, 1);
|
|
h263_decode_motion(s, 0, 1);
|
|
}
|
|
|
|
/* decode each block */
|
|
for (i = 0; i < 6; i++) {
|
|
if (h263_decode_block(s, block[i], i, cbp&32) < 0)
|
|
return -1;
|
|
cbp+=cbp;
|
|
}
|
|
|
|
if(s->pb_frame && h263_skip_b_part(s, cbpb) < 0)
|
|
return -1;
|
|
if(s->obmc && !s->mb_intra){
|
|
if(s->pict_type == AV_PICTURE_TYPE_P && s->mb_x+1<s->mb_width && s->mb_num_left != 1)
|
|
preview_obmc(s);
|
|
}
|
|
end:
|
|
|
|
/* per-MB end of slice check */
|
|
{
|
|
int v= show_bits(&s->gb, 16);
|
|
|
|
if(get_bits_count(&s->gb) + 16 > s->gb.size_in_bits){
|
|
v>>= get_bits_count(&s->gb) + 16 - s->gb.size_in_bits;
|
|
}
|
|
|
|
if(v==0)
|
|
return SLICE_END;
|
|
}
|
|
|
|
return SLICE_OK;
|
|
}
|
|
|
|
/* most is hardcoded. should extend to handle all h263 streams */
|
|
int h263_decode_picture_header(MpegEncContext *s)
|
|
{
|
|
int format, width, height, i;
|
|
uint32_t startcode;
|
|
|
|
align_get_bits(&s->gb);
|
|
|
|
startcode= get_bits(&s->gb, 22-8);
|
|
|
|
for(i= get_bits_left(&s->gb); i>24; i-=8) {
|
|
startcode = ((startcode << 8) | get_bits(&s->gb, 8)) & 0x003FFFFF;
|
|
|
|
if(startcode == 0x20)
|
|
break;
|
|
}
|
|
|
|
if (startcode != 0x20) {
|
|
av_log(s->avctx, AV_LOG_ERROR, "Bad picture start code\n");
|
|
return -1;
|
|
}
|
|
/* temporal reference */
|
|
i = get_bits(&s->gb, 8); /* picture timestamp */
|
|
if( (s->picture_number&~0xFF)+i < s->picture_number)
|
|
i+= 256;
|
|
s->current_picture_ptr->pts=
|
|
s->picture_number= (s->picture_number&~0xFF) + i;
|
|
|
|
/* PTYPE starts here */
|
|
if (get_bits1(&s->gb) != 1) {
|
|
/* marker */
|
|
av_log(s->avctx, AV_LOG_ERROR, "Bad marker\n");
|
|
return -1;
|
|
}
|
|
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);
|
|
/*
|
|
0 forbidden
|
|
1 sub-QCIF
|
|
10 QCIF
|
|
7 extended PTYPE (PLUSPTYPE)
|
|
*/
|
|
|
|
if (format != 7 && format != 6) {
|
|
s->h263_plus = 0;
|
|
/* H.263v1 */
|
|
width = h263_format[format][0];
|
|
height = h263_format[format][1];
|
|
if (!width)
|
|
return -1;
|
|
|
|
s->pict_type = AV_PICTURE_TYPE_I + get_bits1(&s->gb);
|
|
|
|
s->h263_long_vectors = get_bits1(&s->gb);
|
|
|
|
if (get_bits1(&s->gb) != 0) {
|
|
av_log(s->avctx, AV_LOG_ERROR, "H263 SAC not supported\n");
|
|
return -1; /* SAC: off */
|
|
}
|
|
s->obmc= get_bits1(&s->gb); /* Advanced prediction mode */
|
|
s->unrestricted_mv = s->h263_long_vectors || s->obmc;
|
|
|
|
s->pb_frame = get_bits1(&s->gb);
|
|
s->chroma_qscale= s->qscale = get_bits(&s->gb, 5);
|
|
skip_bits1(&s->gb); /* Continuous Presence Multipoint mode: off */
|
|
|
|
s->width = width;
|
|
s->height = height;
|
|
s->avctx->sample_aspect_ratio= (AVRational){12,11};
|
|
s->avctx->time_base= (AVRational){1001, 30000};
|
|
} else {
|
|
int ufep;
|
|
|
|
/* H.263v2 */
|
|
s->h263_plus = 1;
|
|
ufep = get_bits(&s->gb, 3); /* Update Full Extended PTYPE */
|
|
|
|
/* ufep other than 0 and 1 are reserved */
|
|
if (ufep == 1) {
|
|
/* OPPTYPE */
|
|
format = get_bits(&s->gb, 3);
|
|
av_dlog(s->avctx, "ufep=1, format: %d\n", format);
|
|
s->custom_pcf= get_bits1(&s->gb);
|
|
s->umvplus = get_bits1(&s->gb); /* Unrestricted Motion Vector */
|
|
if (get_bits1(&s->gb) != 0) {
|
|
av_log(s->avctx, AV_LOG_ERROR, "Syntax-based Arithmetic Coding (SAC) not supported\n");
|
|
}
|
|
s->obmc= get_bits1(&s->gb); /* Advanced prediction mode */
|
|
s->h263_aic = get_bits1(&s->gb); /* Advanced Intra Coding (AIC) */
|
|
s->loop_filter= get_bits1(&s->gb);
|
|
s->unrestricted_mv = s->umvplus || s->obmc || s->loop_filter;
|
|
|
|
s->h263_slice_structured= get_bits1(&s->gb);
|
|
if (get_bits1(&s->gb) != 0) {
|
|
av_log(s->avctx, AV_LOG_ERROR, "Reference Picture Selection not supported\n");
|
|
}
|
|
if (get_bits1(&s->gb) != 0) {
|
|
av_log(s->avctx, AV_LOG_ERROR, "Independent Segment Decoding not supported\n");
|
|
}
|
|
s->alt_inter_vlc= get_bits1(&s->gb);
|
|
s->modified_quant= get_bits1(&s->gb);
|
|
if(s->modified_quant)
|
|
s->chroma_qscale_table= ff_h263_chroma_qscale_table;
|
|
|
|
skip_bits(&s->gb, 1); /* Prevent start code emulation */
|
|
|
|
skip_bits(&s->gb, 3); /* Reserved */
|
|
} else if (ufep != 0) {
|
|
av_log(s->avctx, AV_LOG_ERROR, "Bad UFEP type (%d)\n", ufep);
|
|
return -1;
|
|
}
|
|
|
|
/* MPPTYPE */
|
|
s->pict_type = get_bits(&s->gb, 3);
|
|
switch(s->pict_type){
|
|
case 0: s->pict_type= AV_PICTURE_TYPE_I;break;
|
|
case 1: s->pict_type= AV_PICTURE_TYPE_P;break;
|
|
case 2: s->pict_type= AV_PICTURE_TYPE_P;s->pb_frame = 3;break;
|
|
case 3: s->pict_type= AV_PICTURE_TYPE_B;break;
|
|
case 7: s->pict_type= AV_PICTURE_TYPE_I;break; //ZYGO
|
|
default:
|
|
return -1;
|
|
}
|
|
skip_bits(&s->gb, 2);
|
|
s->no_rounding = get_bits1(&s->gb);
|
|
skip_bits(&s->gb, 4);
|
|
|
|
/* Get the picture dimensions */
|
|
if (ufep) {
|
|
if (format == 6) {
|
|
/* Custom Picture Format (CPFMT) */
|
|
s->aspect_ratio_info = get_bits(&s->gb, 4);
|
|
av_dlog(s->avctx, "aspect: %d\n", s->aspect_ratio_info);
|
|
/* aspect ratios:
|
|
0 - forbidden
|
|
1 - 1:1
|
|
2 - 12:11 (CIF 4:3)
|
|
3 - 10:11 (525-type 4:3)
|
|
4 - 16:11 (CIF 16:9)
|
|
5 - 40:33 (525-type 16:9)
|
|
6-14 - reserved
|
|
*/
|
|
width = (get_bits(&s->gb, 9) + 1) * 4;
|
|
skip_bits1(&s->gb);
|
|
height = get_bits(&s->gb, 9) * 4;
|
|
av_dlog(s->avctx, "\nH.263+ Custom picture: %dx%d\n",width,height);
|
|
if (s->aspect_ratio_info == FF_ASPECT_EXTENDED) {
|
|
/* aspected dimensions */
|
|
s->avctx->sample_aspect_ratio.num= get_bits(&s->gb, 8);
|
|
s->avctx->sample_aspect_ratio.den= get_bits(&s->gb, 8);
|
|
}else{
|
|
s->avctx->sample_aspect_ratio= ff_h263_pixel_aspect[s->aspect_ratio_info];
|
|
}
|
|
} else {
|
|
width = h263_format[format][0];
|
|
height = h263_format[format][1];
|
|
s->avctx->sample_aspect_ratio= (AVRational){12,11};
|
|
}
|
|
if ((width == 0) || (height == 0))
|
|
return -1;
|
|
s->width = width;
|
|
s->height = height;
|
|
|
|
if(s->custom_pcf){
|
|
int gcd;
|
|
s->avctx->time_base.den= 1800000;
|
|
s->avctx->time_base.num= 1000 + get_bits1(&s->gb);
|
|
s->avctx->time_base.num*= get_bits(&s->gb, 7);
|
|
if(s->avctx->time_base.num == 0){
|
|
av_log(s, AV_LOG_ERROR, "zero framerate\n");
|
|
return -1;
|
|
}
|
|
gcd= av_gcd(s->avctx->time_base.den, s->avctx->time_base.num);
|
|
s->avctx->time_base.den /= gcd;
|
|
s->avctx->time_base.num /= gcd;
|
|
}else{
|
|
s->avctx->time_base= (AVRational){1001, 30000};
|
|
}
|
|
}
|
|
|
|
if(s->custom_pcf){
|
|
skip_bits(&s->gb, 2); //extended Temporal reference
|
|
}
|
|
|
|
if (ufep) {
|
|
if (s->umvplus) {
|
|
if(get_bits1(&s->gb)==0) /* Unlimited Unrestricted Motion Vectors Indicator (UUI) */
|
|
skip_bits1(&s->gb);
|
|
}
|
|
if(s->h263_slice_structured){
|
|
if (get_bits1(&s->gb) != 0) {
|
|
av_log(s->avctx, AV_LOG_ERROR, "rectangular slices not supported\n");
|
|
}
|
|
if (get_bits1(&s->gb) != 0) {
|
|
av_log(s->avctx, AV_LOG_ERROR, "unordered slices not supported\n");
|
|
}
|
|
}
|
|
}
|
|
|
|
s->qscale = get_bits(&s->gb, 5);
|
|
}
|
|
|
|
s->mb_width = (s->width + 15) / 16;
|
|
s->mb_height = (s->height + 15) / 16;
|
|
s->mb_num = s->mb_width * s->mb_height;
|
|
|
|
if (s->pb_frame) {
|
|
skip_bits(&s->gb, 3); /* Temporal reference for B-pictures */
|
|
if (s->custom_pcf)
|
|
skip_bits(&s->gb, 2); //extended Temporal reference
|
|
skip_bits(&s->gb, 2); /* Quantization information for B-pictures */
|
|
}
|
|
|
|
/* PEI */
|
|
while (get_bits1(&s->gb) != 0) {
|
|
skip_bits(&s->gb, 8);
|
|
}
|
|
|
|
if(s->h263_slice_structured){
|
|
if (get_bits1(&s->gb) != 1) {
|
|
av_log(s->avctx, AV_LOG_ERROR, "SEPB1 marker missing\n");
|
|
return -1;
|
|
}
|
|
|
|
ff_h263_decode_mba(s);
|
|
|
|
if (get_bits1(&s->gb) != 1) {
|
|
av_log(s->avctx, AV_LOG_ERROR, "SEPB2 marker missing\n");
|
|
return -1;
|
|
}
|
|
}
|
|
s->f_code = 1;
|
|
|
|
if(s->h263_aic){
|
|
s->y_dc_scale_table=
|
|
s->c_dc_scale_table= ff_aic_dc_scale_table;
|
|
}else{
|
|
s->y_dc_scale_table=
|
|
s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
|
|
}
|
|
|
|
ff_h263_show_pict_info(s);
|
|
if (s->pict_type == AV_PICTURE_TYPE_I && s->codec_tag == AV_RL32("ZYGO")){
|
|
int i,j;
|
|
for(i=0; i<85; i++) av_log(s->avctx, AV_LOG_DEBUG, "%d", get_bits1(&s->gb));
|
|
av_log(s->avctx, AV_LOG_DEBUG, "\n");
|
|
for(i=0; i<13; i++){
|
|
for(j=0; j<3; j++){
|
|
int v= get_bits(&s->gb, 8);
|
|
v |= get_sbits(&s->gb, 8)<<8;
|
|
av_log(s->avctx, AV_LOG_DEBUG, " %5d", v);
|
|
}
|
|
av_log(s->avctx, AV_LOG_DEBUG, "\n");
|
|
}
|
|
for(i=0; i<50; i++) av_log(s->avctx, AV_LOG_DEBUG, "%d", get_bits1(&s->gb));
|
|
}
|
|
|
|
return 0;
|
|
}
|