annotate ffmpeg/libavcodec/h263.c @ 13:844d341cf643 tip

Back up before ISMIR
author Yading Song <yading.song@eecs.qmul.ac.uk>
date Thu, 31 Oct 2013 13:17:06 +0000
parents 6840f77b83aa
children
rev   line source
yading@10 1 /*
yading@10 2 * H263/MPEG4 backend for encoder and decoder
yading@10 3 * Copyright (c) 2000,2001 Fabrice Bellard
yading@10 4 * H263+ support.
yading@10 5 * Copyright (c) 2001 Juan J. Sierralta P
yading@10 6 * Copyright (c) 2002-2004 Michael Niedermayer <michaelni@gmx.at>
yading@10 7 *
yading@10 8 * This file is part of FFmpeg.
yading@10 9 *
yading@10 10 * FFmpeg is free software; you can redistribute it and/or
yading@10 11 * modify it under the terms of the GNU Lesser General Public
yading@10 12 * License as published by the Free Software Foundation; either
yading@10 13 * version 2.1 of the License, or (at your option) any later version.
yading@10 14 *
yading@10 15 * FFmpeg is distributed in the hope that it will be useful,
yading@10 16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
yading@10 17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
yading@10 18 * Lesser General Public License for more details.
yading@10 19 *
yading@10 20 * You should have received a copy of the GNU Lesser General Public
yading@10 21 * License along with FFmpeg; if not, write to the Free Software
yading@10 22 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
yading@10 23 */
yading@10 24
yading@10 25 /**
yading@10 26 * @file
yading@10 27 * h263/mpeg4 codec.
yading@10 28 */
yading@10 29
yading@10 30 //#define DEBUG
yading@10 31 #include <limits.h>
yading@10 32
yading@10 33 #include "avcodec.h"
yading@10 34 #include "mpegvideo.h"
yading@10 35 #include "h263.h"
yading@10 36 #include "h263data.h"
yading@10 37 #include "mathops.h"
yading@10 38 #include "unary.h"
yading@10 39 #include "flv.h"
yading@10 40 #include "mpeg4video.h"
yading@10 41
yading@10 42 //#undef NDEBUG
yading@10 43 //#include <assert.h>
yading@10 44
yading@10 45 uint8_t ff_h263_static_rl_table_store[2][2][2*MAX_RUN + MAX_LEVEL + 3];
yading@10 46
yading@10 47
yading@10 48 void ff_h263_update_motion_val(MpegEncContext * s){
yading@10 49 const int mb_xy = s->mb_y * s->mb_stride + s->mb_x;
yading@10 50 //FIXME a lot of that is only needed for !low_delay
yading@10 51 const int wrap = s->b8_stride;
yading@10 52 const int xy = s->block_index[0];
yading@10 53
yading@10 54 s->current_picture.mbskip_table[mb_xy] = s->mb_skipped;
yading@10 55
yading@10 56 if(s->mv_type != MV_TYPE_8X8){
yading@10 57 int motion_x, motion_y;
yading@10 58 if (s->mb_intra) {
yading@10 59 motion_x = 0;
yading@10 60 motion_y = 0;
yading@10 61 } else if (s->mv_type == MV_TYPE_16X16) {
yading@10 62 motion_x = s->mv[0][0][0];
yading@10 63 motion_y = s->mv[0][0][1];
yading@10 64 } else /*if (s->mv_type == MV_TYPE_FIELD)*/ {
yading@10 65 int i;
yading@10 66 motion_x = s->mv[0][0][0] + s->mv[0][1][0];
yading@10 67 motion_y = s->mv[0][0][1] + s->mv[0][1][1];
yading@10 68 motion_x = (motion_x>>1) | (motion_x&1);
yading@10 69 for(i=0; i<2; i++){
yading@10 70 s->p_field_mv_table[i][0][mb_xy][0]= s->mv[0][i][0];
yading@10 71 s->p_field_mv_table[i][0][mb_xy][1]= s->mv[0][i][1];
yading@10 72 }
yading@10 73 s->current_picture.ref_index[0][4*mb_xy ] =
yading@10 74 s->current_picture.ref_index[0][4*mb_xy + 1] = s->field_select[0][0];
yading@10 75 s->current_picture.ref_index[0][4*mb_xy + 2] =
yading@10 76 s->current_picture.ref_index[0][4*mb_xy + 3] = s->field_select[0][1];
yading@10 77 }
yading@10 78
yading@10 79 /* no update if 8X8 because it has been done during parsing */
yading@10 80 s->current_picture.motion_val[0][xy][0] = motion_x;
yading@10 81 s->current_picture.motion_val[0][xy][1] = motion_y;
yading@10 82 s->current_picture.motion_val[0][xy + 1][0] = motion_x;
yading@10 83 s->current_picture.motion_val[0][xy + 1][1] = motion_y;
yading@10 84 s->current_picture.motion_val[0][xy + wrap][0] = motion_x;
yading@10 85 s->current_picture.motion_val[0][xy + wrap][1] = motion_y;
yading@10 86 s->current_picture.motion_val[0][xy + 1 + wrap][0] = motion_x;
yading@10 87 s->current_picture.motion_val[0][xy + 1 + wrap][1] = motion_y;
yading@10 88 }
yading@10 89
yading@10 90 if(s->encoding){ //FIXME encoding MUST be cleaned up
yading@10 91 if (s->mv_type == MV_TYPE_8X8)
yading@10 92 s->current_picture.mb_type[mb_xy] = MB_TYPE_L0 | MB_TYPE_8x8;
yading@10 93 else if(s->mb_intra)
yading@10 94 s->current_picture.mb_type[mb_xy] = MB_TYPE_INTRA;
yading@10 95 else
yading@10 96 s->current_picture.mb_type[mb_xy] = MB_TYPE_L0 | MB_TYPE_16x16;
yading@10 97 }
yading@10 98 }
yading@10 99
yading@10 100 int ff_h263_pred_dc(MpegEncContext * s, int n, int16_t **dc_val_ptr)
yading@10 101 {
yading@10 102 int x, y, wrap, a, c, pred_dc;
yading@10 103 int16_t *dc_val;
yading@10 104
yading@10 105 /* find prediction */
yading@10 106 if (n < 4) {
yading@10 107 x = 2 * s->mb_x + (n & 1);
yading@10 108 y = 2 * s->mb_y + ((n & 2) >> 1);
yading@10 109 wrap = s->b8_stride;
yading@10 110 dc_val = s->dc_val[0];
yading@10 111 } else {
yading@10 112 x = s->mb_x;
yading@10 113 y = s->mb_y;
yading@10 114 wrap = s->mb_stride;
yading@10 115 dc_val = s->dc_val[n - 4 + 1];
yading@10 116 }
yading@10 117 /* B C
yading@10 118 * A X
yading@10 119 */
yading@10 120 a = dc_val[(x - 1) + (y) * wrap];
yading@10 121 c = dc_val[(x) + (y - 1) * wrap];
yading@10 122
yading@10 123 /* No prediction outside GOB boundary */
yading@10 124 if(s->first_slice_line && n!=3){
yading@10 125 if(n!=2) c= 1024;
yading@10 126 if(n!=1 && s->mb_x == s->resync_mb_x) a= 1024;
yading@10 127 }
yading@10 128 /* just DC prediction */
yading@10 129 if (a != 1024 && c != 1024)
yading@10 130 pred_dc = (a + c) >> 1;
yading@10 131 else if (a != 1024)
yading@10 132 pred_dc = a;
yading@10 133 else
yading@10 134 pred_dc = c;
yading@10 135
yading@10 136 /* we assume pred is positive */
yading@10 137 *dc_val_ptr = &dc_val[x + y * wrap];
yading@10 138 return pred_dc;
yading@10 139 }
yading@10 140
yading@10 141 void ff_h263_loop_filter(MpegEncContext * s){
yading@10 142 int qp_c;
yading@10 143 const int linesize = s->linesize;
yading@10 144 const int uvlinesize= s->uvlinesize;
yading@10 145 const int xy = s->mb_y * s->mb_stride + s->mb_x;
yading@10 146 uint8_t *dest_y = s->dest[0];
yading@10 147 uint8_t *dest_cb= s->dest[1];
yading@10 148 uint8_t *dest_cr= s->dest[2];
yading@10 149
yading@10 150 // if(s->pict_type==AV_PICTURE_TYPE_B && !s->readable) return;
yading@10 151
yading@10 152 /*
yading@10 153 Diag Top
yading@10 154 Left Center
yading@10 155 */
yading@10 156 if (!IS_SKIP(s->current_picture.mb_type[xy])) {
yading@10 157 qp_c= s->qscale;
yading@10 158 s->dsp.h263_v_loop_filter(dest_y+8*linesize , linesize, qp_c);
yading@10 159 s->dsp.h263_v_loop_filter(dest_y+8*linesize+8, linesize, qp_c);
yading@10 160 }else
yading@10 161 qp_c= 0;
yading@10 162
yading@10 163 if(s->mb_y){
yading@10 164 int qp_dt, qp_tt, qp_tc;
yading@10 165
yading@10 166 if (IS_SKIP(s->current_picture.mb_type[xy - s->mb_stride]))
yading@10 167 qp_tt=0;
yading@10 168 else
yading@10 169 qp_tt = s->current_picture.qscale_table[xy - s->mb_stride];
yading@10 170
yading@10 171 if(qp_c)
yading@10 172 qp_tc= qp_c;
yading@10 173 else
yading@10 174 qp_tc= qp_tt;
yading@10 175
yading@10 176 if(qp_tc){
yading@10 177 const int chroma_qp= s->chroma_qscale_table[qp_tc];
yading@10 178 s->dsp.h263_v_loop_filter(dest_y , linesize, qp_tc);
yading@10 179 s->dsp.h263_v_loop_filter(dest_y+8, linesize, qp_tc);
yading@10 180
yading@10 181 s->dsp.h263_v_loop_filter(dest_cb , uvlinesize, chroma_qp);
yading@10 182 s->dsp.h263_v_loop_filter(dest_cr , uvlinesize, chroma_qp);
yading@10 183 }
yading@10 184
yading@10 185 if(qp_tt)
yading@10 186 s->dsp.h263_h_loop_filter(dest_y-8*linesize+8 , linesize, qp_tt);
yading@10 187
yading@10 188 if(s->mb_x){
yading@10 189 if (qp_tt || IS_SKIP(s->current_picture.mb_type[xy - 1 - s->mb_stride]))
yading@10 190 qp_dt= qp_tt;
yading@10 191 else
yading@10 192 qp_dt = s->current_picture.qscale_table[xy - 1 - s->mb_stride];
yading@10 193
yading@10 194 if(qp_dt){
yading@10 195 const int chroma_qp= s->chroma_qscale_table[qp_dt];
yading@10 196 s->dsp.h263_h_loop_filter(dest_y -8*linesize , linesize, qp_dt);
yading@10 197 s->dsp.h263_h_loop_filter(dest_cb-8*uvlinesize, uvlinesize, chroma_qp);
yading@10 198 s->dsp.h263_h_loop_filter(dest_cr-8*uvlinesize, uvlinesize, chroma_qp);
yading@10 199 }
yading@10 200 }
yading@10 201 }
yading@10 202
yading@10 203 if(qp_c){
yading@10 204 s->dsp.h263_h_loop_filter(dest_y +8, linesize, qp_c);
yading@10 205 if(s->mb_y + 1 == s->mb_height)
yading@10 206 s->dsp.h263_h_loop_filter(dest_y+8*linesize+8, linesize, qp_c);
yading@10 207 }
yading@10 208
yading@10 209 if(s->mb_x){
yading@10 210 int qp_lc;
yading@10 211 if (qp_c || IS_SKIP(s->current_picture.mb_type[xy - 1]))
yading@10 212 qp_lc= qp_c;
yading@10 213 else
yading@10 214 qp_lc = s->current_picture.qscale_table[xy - 1];
yading@10 215
yading@10 216 if(qp_lc){
yading@10 217 s->dsp.h263_h_loop_filter(dest_y, linesize, qp_lc);
yading@10 218 if(s->mb_y + 1 == s->mb_height){
yading@10 219 const int chroma_qp= s->chroma_qscale_table[qp_lc];
yading@10 220 s->dsp.h263_h_loop_filter(dest_y +8* linesize, linesize, qp_lc);
yading@10 221 s->dsp.h263_h_loop_filter(dest_cb , uvlinesize, chroma_qp);
yading@10 222 s->dsp.h263_h_loop_filter(dest_cr , uvlinesize, chroma_qp);
yading@10 223 }
yading@10 224 }
yading@10 225 }
yading@10 226 }
yading@10 227
yading@10 228 void ff_h263_pred_acdc(MpegEncContext * s, int16_t *block, int n)
yading@10 229 {
yading@10 230 int x, y, wrap, a, c, pred_dc, scale, i;
yading@10 231 int16_t *dc_val, *ac_val, *ac_val1;
yading@10 232
yading@10 233 /* find prediction */
yading@10 234 if (n < 4) {
yading@10 235 x = 2 * s->mb_x + (n & 1);
yading@10 236 y = 2 * s->mb_y + (n>> 1);
yading@10 237 wrap = s->b8_stride;
yading@10 238 dc_val = s->dc_val[0];
yading@10 239 ac_val = s->ac_val[0][0];
yading@10 240 scale = s->y_dc_scale;
yading@10 241 } else {
yading@10 242 x = s->mb_x;
yading@10 243 y = s->mb_y;
yading@10 244 wrap = s->mb_stride;
yading@10 245 dc_val = s->dc_val[n - 4 + 1];
yading@10 246 ac_val = s->ac_val[n - 4 + 1][0];
yading@10 247 scale = s->c_dc_scale;
yading@10 248 }
yading@10 249
yading@10 250 ac_val += ((y) * wrap + (x)) * 16;
yading@10 251 ac_val1 = ac_val;
yading@10 252
yading@10 253 /* B C
yading@10 254 * A X
yading@10 255 */
yading@10 256 a = dc_val[(x - 1) + (y) * wrap];
yading@10 257 c = dc_val[(x) + (y - 1) * wrap];
yading@10 258
yading@10 259 /* No prediction outside GOB boundary */
yading@10 260 if(s->first_slice_line && n!=3){
yading@10 261 if(n!=2) c= 1024;
yading@10 262 if(n!=1 && s->mb_x == s->resync_mb_x) a= 1024;
yading@10 263 }
yading@10 264
yading@10 265 if (s->ac_pred) {
yading@10 266 pred_dc = 1024;
yading@10 267 if (s->h263_aic_dir) {
yading@10 268 /* left prediction */
yading@10 269 if (a != 1024) {
yading@10 270 ac_val -= 16;
yading@10 271 for(i=1;i<8;i++) {
yading@10 272 block[s->dsp.idct_permutation[i<<3]] += ac_val[i];
yading@10 273 }
yading@10 274 pred_dc = a;
yading@10 275 }
yading@10 276 } else {
yading@10 277 /* top prediction */
yading@10 278 if (c != 1024) {
yading@10 279 ac_val -= 16 * wrap;
yading@10 280 for(i=1;i<8;i++) {
yading@10 281 block[s->dsp.idct_permutation[i ]] += ac_val[i + 8];
yading@10 282 }
yading@10 283 pred_dc = c;
yading@10 284 }
yading@10 285 }
yading@10 286 } else {
yading@10 287 /* just DC prediction */
yading@10 288 if (a != 1024 && c != 1024)
yading@10 289 pred_dc = (a + c) >> 1;
yading@10 290 else if (a != 1024)
yading@10 291 pred_dc = a;
yading@10 292 else
yading@10 293 pred_dc = c;
yading@10 294 }
yading@10 295
yading@10 296 /* we assume pred is positive */
yading@10 297 block[0]=block[0]*scale + pred_dc;
yading@10 298
yading@10 299 if (block[0] < 0)
yading@10 300 block[0] = 0;
yading@10 301 else
yading@10 302 block[0] |= 1;
yading@10 303
yading@10 304 /* Update AC/DC tables */
yading@10 305 dc_val[(x) + (y) * wrap] = block[0];
yading@10 306
yading@10 307 /* left copy */
yading@10 308 for(i=1;i<8;i++)
yading@10 309 ac_val1[i ] = block[s->dsp.idct_permutation[i<<3]];
yading@10 310 /* top copy */
yading@10 311 for(i=1;i<8;i++)
yading@10 312 ac_val1[8 + i] = block[s->dsp.idct_permutation[i ]];
yading@10 313 }
yading@10 314
yading@10 315 int16_t *ff_h263_pred_motion(MpegEncContext * s, int block, int dir,
yading@10 316 int *px, int *py)
yading@10 317 {
yading@10 318 int wrap;
yading@10 319 int16_t *A, *B, *C, (*mot_val)[2];
yading@10 320 static const int off[4]= {2, 1, 1, -1};
yading@10 321
yading@10 322 wrap = s->b8_stride;
yading@10 323 mot_val = s->current_picture.motion_val[dir] + s->block_index[block];
yading@10 324
yading@10 325 A = mot_val[ - 1];
yading@10 326 /* special case for first (slice) line */
yading@10 327 if (s->first_slice_line && block<3) {
yading@10 328 // we can't just change some MVs to simulate that as we need them for the B frames (and ME)
yading@10 329 // and if we ever support non rectangular objects than we need to do a few ifs here anyway :(
yading@10 330 if(block==0){ //most common case
yading@10 331 if(s->mb_x == s->resync_mb_x){ //rare
yading@10 332 *px= *py = 0;
yading@10 333 }else if(s->mb_x + 1 == s->resync_mb_x && s->h263_pred){ //rare
yading@10 334 C = mot_val[off[block] - wrap];
yading@10 335 if(s->mb_x==0){
yading@10 336 *px = C[0];
yading@10 337 *py = C[1];
yading@10 338 }else{
yading@10 339 *px = mid_pred(A[0], 0, C[0]);
yading@10 340 *py = mid_pred(A[1], 0, C[1]);
yading@10 341 }
yading@10 342 }else{
yading@10 343 *px = A[0];
yading@10 344 *py = A[1];
yading@10 345 }
yading@10 346 }else if(block==1){
yading@10 347 if(s->mb_x + 1 == s->resync_mb_x && s->h263_pred){ //rare
yading@10 348 C = mot_val[off[block] - wrap];
yading@10 349 *px = mid_pred(A[0], 0, C[0]);
yading@10 350 *py = mid_pred(A[1], 0, C[1]);
yading@10 351 }else{
yading@10 352 *px = A[0];
yading@10 353 *py = A[1];
yading@10 354 }
yading@10 355 }else{ /* block==2*/
yading@10 356 B = mot_val[ - wrap];
yading@10 357 C = mot_val[off[block] - wrap];
yading@10 358 if(s->mb_x == s->resync_mb_x) //rare
yading@10 359 A[0]=A[1]=0;
yading@10 360
yading@10 361 *px = mid_pred(A[0], B[0], C[0]);
yading@10 362 *py = mid_pred(A[1], B[1], C[1]);
yading@10 363 }
yading@10 364 } else {
yading@10 365 B = mot_val[ - wrap];
yading@10 366 C = mot_val[off[block] - wrap];
yading@10 367 *px = mid_pred(A[0], B[0], C[0]);
yading@10 368 *py = mid_pred(A[1], B[1], C[1]);
yading@10 369 }
yading@10 370 return *mot_val;
yading@10 371 }
yading@10 372
yading@10 373
yading@10 374 /**
yading@10 375 * Get the GOB height based on picture height.
yading@10 376 */
yading@10 377 int ff_h263_get_gob_height(MpegEncContext *s){
yading@10 378 if (s->height <= 400)
yading@10 379 return 1;
yading@10 380 else if (s->height <= 800)
yading@10 381 return 2;
yading@10 382 else
yading@10 383 return 4;
yading@10 384 }