comparison h263.c @ 9103:b626fed816d7 libavcodec

Add PB-frame decoding support for H.263/i263 (and enable it for i263)
author kostya
date Tue, 03 Mar 2009 05:17:22 +0000
parents e9ba8210d495
children fd301ba2cbba
comparison
equal deleted inserted replaced
9102:42a7dfa5b3e4 9103:b626fed816d7
38 #include "avcodec.h" 38 #include "avcodec.h"
39 #include "mpegvideo.h" 39 #include "mpegvideo.h"
40 #include "h263data.h" 40 #include "h263data.h"
41 #include "mpeg4data.h" 41 #include "mpeg4data.h"
42 #include "mathops.h" 42 #include "mathops.h"
43 #include "unary.h"
43 44
44 //#undef NDEBUG 45 //#undef NDEBUG
45 //#include <assert.h> 46 //#include <assert.h>
46 47
47 #define INTRA_MCBPC_VLC_BITS 6 48 #define INTRA_MCBPC_VLC_BITS 6
3903 }else 3904 }else
3904 s->qscale += quant_tab[get_bits(&s->gb, 2)]; 3905 s->qscale += quant_tab[get_bits(&s->gb, 2)];
3905 ff_set_qscale(s, s->qscale); 3906 ff_set_qscale(s, s->qscale);
3906 } 3907 }
3907 3908
3909 static int h263_skip_b_part(MpegEncContext *s, int cbp)
3910 {
3911 DECLARE_ALIGNED(16, DCTELEM, dblock[64]);
3912 int i, mbi;
3913
3914 /* we have to set s->mb_intra to zero to decode B-part of PB-frame correctly
3915 * but real value should be restored in order to be used later (in OBMC condition)
3916 */
3917 mbi = s->mb_intra;
3918 s->mb_intra = 0;
3919 for (i = 0; i < 6; i++) {
3920 if (h263_decode_block(s, dblock, i, cbp&32) < 0)
3921 return -1;
3922 cbp+=cbp;
3923 }
3924 s->mb_intra = mbi;
3925 return 0;
3926 }
3927
3928 static int h263_get_modb(GetBitContext *gb, int pb_frame, int *cbpb)
3929 {
3930 int c, mv = 1;
3931
3932 if (pb_frame < 3) { // h.263 Annex G and i263 PB-frame
3933 c = get_bits1(gb);
3934 if (pb_frame == 2 && c)
3935 mv = !get_bits1(gb);
3936 } else { // h.263 Annex M improved PB-frame
3937 mv = get_unary(gb, 0, 4) + 1;
3938 c = mv & 1;
3939 mv = !!(mv & 2);
3940 }
3941 if(c)
3942 *cbpb = get_bits(gb, 6);
3943 return mv;
3944 }
3945
3908 int ff_h263_decode_mb(MpegEncContext *s, 3946 int ff_h263_decode_mb(MpegEncContext *s,
3909 DCTELEM block[6][64]) 3947 DCTELEM block[6][64])
3910 { 3948 {
3911 int cbpc, cbpy, i, cbp, pred_x, pred_y, mx, my, dquant; 3949 int cbpc, cbpy, i, cbp, pred_x, pred_y, mx, my, dquant;
3912 int16_t *mot_val; 3950 int16_t *mot_val;
3913 const int xy= s->mb_x + s->mb_y * s->mb_stride; 3951 const int xy= s->mb_x + s->mb_y * s->mb_stride;
3952 int cbpb = 0, pb_mv_count = 0;
3914 3953
3915 assert(!s->h263_pred); 3954 assert(!s->h263_pred);
3916 3955
3917 if (s->pict_type == FF_P_TYPE) { 3956 if (s->pict_type == FF_P_TYPE) {
3918 do{ 3957 do{
3941 3980
3942 dquant = cbpc & 8; 3981 dquant = cbpc & 8;
3943 s->mb_intra = ((cbpc & 4) != 0); 3982 s->mb_intra = ((cbpc & 4) != 0);
3944 if (s->mb_intra) goto intra; 3983 if (s->mb_intra) goto intra;
3945 3984
3985 if(s->pb_frame && get_bits1(&s->gb))
3986 pb_mv_count = h263_get_modb(&s->gb, s->pb_frame, &cbpb);
3946 cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1); 3987 cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
3947 3988
3948 if(s->alt_inter_vlc==0 || (cbpc & 3)!=3) 3989 if(s->alt_inter_vlc==0 || (cbpc & 3)!=3)
3949 cbpy ^= 0xF; 3990 cbpy ^= 0xF;
3950 3991
4116 s->h263_aic_dir = get_bits1(&s->gb); 4157 s->h263_aic_dir = get_bits1(&s->gb);
4117 } 4158 }
4118 }else 4159 }else
4119 s->ac_pred = 0; 4160 s->ac_pred = 0;
4120 4161
4162 if(s->pb_frame && get_bits1(&s->gb))
4163 pb_mv_count = h263_get_modb(&s->gb, s->pb_frame, &cbpb);
4121 cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1); 4164 cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
4122 if(cbpy<0){ 4165 if(cbpy<0){
4123 av_log(s->avctx, AV_LOG_ERROR, "I cbpy damaged at %d %d\n", s->mb_x, s->mb_y); 4166 av_log(s->avctx, AV_LOG_ERROR, "I cbpy damaged at %d %d\n", s->mb_x, s->mb_y);
4124 return -1; 4167 return -1;
4125 } 4168 }
4126 cbp = (cbpc & 3) | (cbpy << 2); 4169 cbp = (cbpc & 3) | (cbpy << 2);
4127 if (dquant) { 4170 if (dquant) {
4128 h263_decode_dquant(s); 4171 h263_decode_dquant(s);
4129 } 4172 }
4173
4174 pb_mv_count += !!s->pb_frame;
4175 }
4176
4177 while(pb_mv_count--){
4178 h263_decode_motion(s, 0, 1);
4179 h263_decode_motion(s, 0, 1);
4130 } 4180 }
4131 4181
4132 /* decode each block */ 4182 /* decode each block */
4133 for (i = 0; i < 6; i++) { 4183 for (i = 0; i < 6; i++) {
4134 if (h263_decode_block(s, block[i], i, cbp&32) < 0) 4184 if (h263_decode_block(s, block[i], i, cbp&32) < 0)
4135 return -1; 4185 return -1;
4136 cbp+=cbp; 4186 cbp+=cbp;
4137 } 4187 }
4138 4188
4189 if(s->pb_frame && h263_skip_b_part(s, cbpb) < 0)
4190 return -1;
4139 if(s->obmc && !s->mb_intra){ 4191 if(s->obmc && !s->mb_intra){
4140 if(s->pict_type == FF_P_TYPE && s->mb_x+1<s->mb_width && s->mb_num_left != 1) 4192 if(s->pict_type == FF_P_TYPE && s->mb_x+1<s->mb_width && s->mb_num_left != 1)
4141 preview_obmc(s); 4193 preview_obmc(s);
4142 } 4194 }
4143 end: 4195 end:
6239 s->c_dc_scale_table= ff_mpeg1_dc_scale_table; 6291 s->c_dc_scale_table= ff_mpeg1_dc_scale_table;
6240 6292
6241 if(s->avctx->debug&FF_DEBUG_PICT_INFO) 6293 if(s->avctx->debug&FF_DEBUG_PICT_INFO)
6242 show_pict_info(s); 6294 show_pict_info(s);
6243 6295
6244 if(s->pb_frame){
6245 av_log(s->avctx, AV_LOG_ERROR, "PB frame mode no supported\n");
6246 return -1; /* PB frame mode */
6247 }
6248 return 0; 6296 return 0;
6249 } 6297 }
6250 6298
6251 int flv_h263_decode_picture_header(MpegEncContext *s) 6299 int flv_h263_decode_picture_header(MpegEncContext *s)
6252 { 6300 {