2 * H.26L/H.264/AVC/JVT/14496-10/... encoder/decoder
3 * Copyright (c) 2003 Michael Niedermayer <michaelni@gmx.at>
5 * This file is part of FFmpeg.
7 * FFmpeg is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * FFmpeg is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with FFmpeg; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
23 * @file libavcodec/h264.c
24 * H.264 / AVC / MPEG4 part10 codec.
25 * @author Michael Niedermayer <michaelni@gmx.at>
31 #include "mpegvideo.h"
34 #include "h264_mvpred.h"
35 #include "h264_parser.h"
38 #include "rectangle.h"
39 #include "vdpau_internal.h"
46 static void svq3_luma_dc_dequant_idct_c(DCTELEM
*block
, int qp
);
47 static void svq3_add_idct_c(uint8_t *dst
, DCTELEM
*block
, int stride
, int qp
, int dc
);
49 static const uint8_t rem6
[52]={
50 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3,
53 static const uint8_t div6
[52]={
54 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8,
57 void ff_h264_write_back_intra_pred_mode(H264Context
*h
){
58 const int mb_xy
= h
->mb_xy
;
60 h
->intra4x4_pred_mode
[mb_xy
][0]= h
->intra4x4_pred_mode_cache
[7+8*1];
61 h
->intra4x4_pred_mode
[mb_xy
][1]= h
->intra4x4_pred_mode_cache
[7+8*2];
62 h
->intra4x4_pred_mode
[mb_xy
][2]= h
->intra4x4_pred_mode_cache
[7+8*3];
63 h
->intra4x4_pred_mode
[mb_xy
][3]= h
->intra4x4_pred_mode_cache
[7+8*4];
64 h
->intra4x4_pred_mode
[mb_xy
][4]= h
->intra4x4_pred_mode_cache
[4+8*4];
65 h
->intra4x4_pred_mode
[mb_xy
][5]= h
->intra4x4_pred_mode_cache
[5+8*4];
66 h
->intra4x4_pred_mode
[mb_xy
][6]= h
->intra4x4_pred_mode_cache
[6+8*4];
70 * checks if the top & left blocks are available if needed & changes the dc mode so it only uses the available blocks.
72 int ff_h264_check_intra4x4_pred_mode(H264Context
*h
){
73 MpegEncContext
* const s
= &h
->s
;
74 static const int8_t top
[12]= {-1, 0,LEFT_DC_PRED
,-1,-1,-1,-1,-1, 0};
75 static const int8_t left
[12]= { 0,-1, TOP_DC_PRED
, 0,-1,-1,-1, 0,-1,DC_128_PRED
};
78 if(!(h
->top_samples_available
&0x8000)){
80 int status
= top
[ h
->intra4x4_pred_mode_cache
[scan8
[0] + i
] ];
82 av_log(h
->s
.avctx
, AV_LOG_ERROR
, "top block unavailable for requested intra4x4 mode %d at %d %d\n", status
, s
->mb_x
, s
->mb_y
);
85 h
->intra4x4_pred_mode_cache
[scan8
[0] + i
]= status
;
90 if((h
->left_samples_available
&0x8888)!=0x8888){
91 static const int mask
[4]={0x8000,0x2000,0x80,0x20};
93 if(!(h
->left_samples_available
&mask
[i
])){
94 int status
= left
[ h
->intra4x4_pred_mode_cache
[scan8
[0] + 8*i
] ];
96 av_log(h
->s
.avctx
, AV_LOG_ERROR
, "left block unavailable for requested intra4x4 mode %d at %d %d\n", status
, s
->mb_x
, s
->mb_y
);
99 h
->intra4x4_pred_mode_cache
[scan8
[0] + 8*i
]= status
;
106 } //FIXME cleanup like ff_h264_check_intra_pred_mode
109 * checks if the top & left blocks are available if needed & changes the dc mode so it only uses the available blocks.
111 int ff_h264_check_intra_pred_mode(H264Context
*h
, int mode
){
112 MpegEncContext
* const s
= &h
->s
;
113 static const int8_t top
[7]= {LEFT_DC_PRED8x8
, 1,-1,-1};
114 static const int8_t left
[7]= { TOP_DC_PRED8x8
,-1, 2,-1,DC_128_PRED8x8
};
117 av_log(h
->s
.avctx
, AV_LOG_ERROR
, "out of range intra chroma pred mode at %d %d\n", s
->mb_x
, s
->mb_y
);
121 if(!(h
->top_samples_available
&0x8000)){
124 av_log(h
->s
.avctx
, AV_LOG_ERROR
, "top block unavailable for requested intra mode at %d %d\n", s
->mb_x
, s
->mb_y
);
129 if((h
->left_samples_available
&0x8080) != 0x8080){
131 if(h
->left_samples_available
&0x8080){ //mad cow disease mode, aka MBAFF + constrained_intra_pred
132 mode
= ALZHEIMER_DC_L0T_PRED8x8
+ (!(h
->left_samples_available
&0x8000)) + 2*(mode
== DC_128_PRED8x8
);
135 av_log(h
->s
.avctx
, AV_LOG_ERROR
, "left block unavailable for requested intra mode at %d %d\n", s
->mb_x
, s
->mb_y
);
143 const uint8_t *ff_h264_decode_nal(H264Context
*h
, const uint8_t *src
, int *dst_length
, int *consumed
, int length
){
148 // src[0]&0x80; //forbidden bit
149 h
->nal_ref_idc
= src
[0]>>5;
150 h
->nal_unit_type
= src
[0]&0x1F;
154 for(i
=0; i
<length
; i
++)
155 printf("%2X ", src
[i
]);
158 #if HAVE_FAST_UNALIGNED
161 for(i
=0; i
+1<length
; i
+=9){
162 if(!((~*(const uint64_t*)(src
+i
) & (*(const uint64_t*)(src
+i
) - 0x0100010001000101ULL
)) & 0x8000800080008080ULL
))
165 for(i
=0; i
+1<length
; i
+=5){
166 if(!((~*(const uint32_t*)(src
+i
) & (*(const uint32_t*)(src
+i
) - 0x01000101U
)) & 0x80008080U
))
169 if(i
>0 && !src
[i
]) i
--;
173 for(i
=0; i
+1<length
; i
+=2){
175 if(i
>0 && src
[i
-1]==0) i
--;
177 if(i
+2<length
&& src
[i
+1]==0 && src
[i
+2]<=3){
179 /* startcode, so we must be past the end */
187 if(i
>=length
-1){ //no escaped 0
189 *consumed
= length
+1; //+1 for the header
193 bufidx
= h
->nal_unit_type
== NAL_DPC ?
1 : 0; // use second escape buffer for inter data
194 av_fast_malloc(&h
->rbsp_buffer
[bufidx
], &h
->rbsp_buffer_size
[bufidx
], length
+FF_INPUT_BUFFER_PADDING_SIZE
);
195 dst
= h
->rbsp_buffer
[bufidx
];
201 //printf("decoding esc\n");
205 //remove escapes (very rare 1:2^22)
207 dst
[di
++]= src
[si
++];
208 dst
[di
++]= src
[si
++];
209 }else if(src
[si
]==0 && src
[si
+1]==0){
210 if(src
[si
+2]==3){ //escape
215 }else //next start code
219 dst
[di
++]= src
[si
++];
222 dst
[di
++]= src
[si
++];
225 memset(dst
+di
, 0, FF_INPUT_BUFFER_PADDING_SIZE
);
228 *consumed
= si
+ 1;//+1 for the header
229 //FIXME store exact number of bits in the getbitcontext (it is needed for decoding)
233 int ff_h264_decode_rbsp_trailing(H264Context
*h
, const uint8_t *src
){
237 tprintf(h
->s
.avctx
, "rbsp trailing %X\n", v
);
247 * IDCT transforms the 16 dc values and dequantizes them.
248 * @param qp quantization parameter
250 static void h264_luma_dc_dequant_idct_c(DCTELEM
*block
, int qp
, int qmul
){
253 int temp
[16]; //FIXME check if this is a good idea
254 static const int x_offset
[4]={0, 1*stride
, 4* stride
, 5*stride
};
255 static const int y_offset
[4]={0, 2*stride
, 8* stride
, 10*stride
};
257 //memset(block, 64, 2*256);
260 const int offset
= y_offset
[i
];
261 const int z0
= block
[offset
+stride
*0] + block
[offset
+stride
*4];
262 const int z1
= block
[offset
+stride
*0] - block
[offset
+stride
*4];
263 const int z2
= block
[offset
+stride
*1] - block
[offset
+stride
*5];
264 const int z3
= block
[offset
+stride
*1] + block
[offset
+stride
*5];
273 const int offset
= x_offset
[i
];
274 const int z0
= temp
[4*0+i
] + temp
[4*2+i
];
275 const int z1
= temp
[4*0+i
] - temp
[4*2+i
];
276 const int z2
= temp
[4*1+i
] - temp
[4*3+i
];
277 const int z3
= temp
[4*1+i
] + temp
[4*3+i
];
279 block
[stride
*0 +offset
]= ((((z0
+ z3
)*qmul
+ 128 ) >> 8)); //FIXME think about merging this into decode_residual
280 block
[stride
*2 +offset
]= ((((z1
+ z2
)*qmul
+ 128 ) >> 8));
281 block
[stride
*8 +offset
]= ((((z1
- z2
)*qmul
+ 128 ) >> 8));
282 block
[stride
*10+offset
]= ((((z0
- z3
)*qmul
+ 128 ) >> 8));
288 * DCT transforms the 16 dc values.
289 * @param qp quantization parameter ??? FIXME
291 static void h264_luma_dc_dct_c(DCTELEM
*block
/*, int qp*/){
292 // const int qmul= dequant_coeff[qp][0];
294 int temp
[16]; //FIXME check if this is a good idea
295 static const int x_offset
[4]={0, 1*stride
, 4* stride
, 5*stride
};
296 static const int y_offset
[4]={0, 2*stride
, 8* stride
, 10*stride
};
299 const int offset
= y_offset
[i
];
300 const int z0
= block
[offset
+stride
*0] + block
[offset
+stride
*4];
301 const int z1
= block
[offset
+stride
*0] - block
[offset
+stride
*4];
302 const int z2
= block
[offset
+stride
*1] - block
[offset
+stride
*5];
303 const int z3
= block
[offset
+stride
*1] + block
[offset
+stride
*5];
312 const int offset
= x_offset
[i
];
313 const int z0
= temp
[4*0+i
] + temp
[4*2+i
];
314 const int z1
= temp
[4*0+i
] - temp
[4*2+i
];
315 const int z2
= temp
[4*1+i
] - temp
[4*3+i
];
316 const int z3
= temp
[4*1+i
] + temp
[4*3+i
];
318 block
[stride
*0 +offset
]= (z0
+ z3
)>>1;
319 block
[stride
*2 +offset
]= (z1
+ z2
)>>1;
320 block
[stride
*8 +offset
]= (z1
- z2
)>>1;
321 block
[stride
*10+offset
]= (z0
- z3
)>>1;
329 static void chroma_dc_dequant_idct_c(DCTELEM
*block
, int qp
, int qmul
){
330 const int stride
= 16*2;
331 const int xStride
= 16;
334 a
= block
[stride
*0 + xStride
*0];
335 b
= block
[stride
*0 + xStride
*1];
336 c
= block
[stride
*1 + xStride
*0];
337 d
= block
[stride
*1 + xStride
*1];
344 block
[stride
*0 + xStride
*0]= ((a
+c
)*qmul
) >> 7;
345 block
[stride
*0 + xStride
*1]= ((e
+b
)*qmul
) >> 7;
346 block
[stride
*1 + xStride
*0]= ((a
-c
)*qmul
) >> 7;
347 block
[stride
*1 + xStride
*1]= ((e
-b
)*qmul
) >> 7;
351 static void chroma_dc_dct_c(DCTELEM
*block
){
352 const int stride
= 16*2;
353 const int xStride
= 16;
356 a
= block
[stride
*0 + xStride
*0];
357 b
= block
[stride
*0 + xStride
*1];
358 c
= block
[stride
*1 + xStride
*0];
359 d
= block
[stride
*1 + xStride
*1];
366 block
[stride
*0 + xStride
*0]= (a
+c
);
367 block
[stride
*0 + xStride
*1]= (e
+b
);
368 block
[stride
*1 + xStride
*0]= (a
-c
);
369 block
[stride
*1 + xStride
*1]= (e
-b
);
373 static inline void mc_dir_part(H264Context
*h
, Picture
*pic
, int n
, int square
, int chroma_height
, int delta
, int list
,
374 uint8_t *dest_y
, uint8_t *dest_cb
, uint8_t *dest_cr
,
375 int src_x_offset
, int src_y_offset
,
376 qpel_mc_func
*qpix_op
, h264_chroma_mc_func chroma_op
){
377 MpegEncContext
* const s
= &h
->s
;
378 const int mx
= h
->mv_cache
[list
][ scan8
[n
] ][0] + src_x_offset
*8;
379 int my
= h
->mv_cache
[list
][ scan8
[n
] ][1] + src_y_offset
*8;
380 const int luma_xy
= (mx
&3) + ((my
&3)<<2);
381 uint8_t * src_y
= pic
->data
[0] + (mx
>>2) + (my
>>2)*h
->mb_linesize
;
382 uint8_t * src_cb
, * src_cr
;
383 int extra_width
= h
->emu_edge_width
;
384 int extra_height
= h
->emu_edge_height
;
386 const int full_mx
= mx
>>2;
387 const int full_my
= my
>>2;
388 const int pic_width
= 16*s
->mb_width
;
389 const int pic_height
= 16*s
->mb_height
>> MB_FIELD
;
391 if(mx
&7) extra_width
-= 3;
392 if(my
&7) extra_height
-= 3;
394 if( full_mx
< 0-extra_width
395 || full_my
< 0-extra_height
396 || full_mx
+ 16/*FIXME*/ > pic_width
+ extra_width
397 || full_my
+ 16/*FIXME*/ > pic_height
+ extra_height
){
398 ff_emulated_edge_mc(s
->edge_emu_buffer
, src_y
- 2 - 2*h
->mb_linesize
, h
->mb_linesize
, 16+5, 16+5/*FIXME*/, full_mx
-2, full_my
-2, pic_width
, pic_height
);
399 src_y
= s
->edge_emu_buffer
+ 2 + 2*h
->mb_linesize
;
403 qpix_op
[luma_xy
](dest_y
, src_y
, h
->mb_linesize
); //FIXME try variable height perhaps?
405 qpix_op
[luma_xy
](dest_y
+ delta
, src_y
+ delta
, h
->mb_linesize
);
408 if(CONFIG_GRAY
&& s
->flags
&CODEC_FLAG_GRAY
) return;
411 // chroma offset when predicting from a field of opposite parity
412 my
+= 2 * ((s
->mb_y
& 1) - (pic
->reference
- 1));
413 emu
|= (my
>>3) < 0 || (my
>>3) + 8 >= (pic_height
>>1);
415 src_cb
= pic
->data
[1] + (mx
>>3) + (my
>>3)*h
->mb_uvlinesize
;
416 src_cr
= pic
->data
[2] + (mx
>>3) + (my
>>3)*h
->mb_uvlinesize
;
419 ff_emulated_edge_mc(s
->edge_emu_buffer
, src_cb
, h
->mb_uvlinesize
, 9, 9/*FIXME*/, (mx
>>3), (my
>>3), pic_width
>>1, pic_height
>>1);
420 src_cb
= s
->edge_emu_buffer
;
422 chroma_op(dest_cb
, src_cb
, h
->mb_uvlinesize
, chroma_height
, mx
&7, my
&7);
425 ff_emulated_edge_mc(s
->edge_emu_buffer
, src_cr
, h
->mb_uvlinesize
, 9, 9/*FIXME*/, (mx
>>3), (my
>>3), pic_width
>>1, pic_height
>>1);
426 src_cr
= s
->edge_emu_buffer
;
428 chroma_op(dest_cr
, src_cr
, h
->mb_uvlinesize
, chroma_height
, mx
&7, my
&7);
431 static inline void mc_part_std(H264Context
*h
, int n
, int square
, int chroma_height
, int delta
,
432 uint8_t *dest_y
, uint8_t *dest_cb
, uint8_t *dest_cr
,
433 int x_offset
, int y_offset
,
434 qpel_mc_func
*qpix_put
, h264_chroma_mc_func chroma_put
,
435 qpel_mc_func
*qpix_avg
, h264_chroma_mc_func chroma_avg
,
436 int list0
, int list1
){
437 MpegEncContext
* const s
= &h
->s
;
438 qpel_mc_func
*qpix_op
= qpix_put
;
439 h264_chroma_mc_func chroma_op
= chroma_put
;
441 dest_y
+= 2*x_offset
+ 2*y_offset
*h
-> mb_linesize
;
442 dest_cb
+= x_offset
+ y_offset
*h
->mb_uvlinesize
;
443 dest_cr
+= x_offset
+ y_offset
*h
->mb_uvlinesize
;
444 x_offset
+= 8*s
->mb_x
;
445 y_offset
+= 8*(s
->mb_y
>> MB_FIELD
);
448 Picture
*ref
= &h
->ref_list
[0][ h
->ref_cache
[0][ scan8
[n
] ] ];
449 mc_dir_part(h
, ref
, n
, square
, chroma_height
, delta
, 0,
450 dest_y
, dest_cb
, dest_cr
, x_offset
, y_offset
,
454 chroma_op
= chroma_avg
;
458 Picture
*ref
= &h
->ref_list
[1][ h
->ref_cache
[1][ scan8
[n
] ] ];
459 mc_dir_part(h
, ref
, n
, square
, chroma_height
, delta
, 1,
460 dest_y
, dest_cb
, dest_cr
, x_offset
, y_offset
,
465 static inline void mc_part_weighted(H264Context
*h
, int n
, int square
, int chroma_height
, int delta
,
466 uint8_t *dest_y
, uint8_t *dest_cb
, uint8_t *dest_cr
,
467 int x_offset
, int y_offset
,
468 qpel_mc_func
*qpix_put
, h264_chroma_mc_func chroma_put
,
469 h264_weight_func luma_weight_op
, h264_weight_func chroma_weight_op
,
470 h264_biweight_func luma_weight_avg
, h264_biweight_func chroma_weight_avg
,
471 int list0
, int list1
){
472 MpegEncContext
* const s
= &h
->s
;
474 dest_y
+= 2*x_offset
+ 2*y_offset
*h
-> mb_linesize
;
475 dest_cb
+= x_offset
+ y_offset
*h
->mb_uvlinesize
;
476 dest_cr
+= x_offset
+ y_offset
*h
->mb_uvlinesize
;
477 x_offset
+= 8*s
->mb_x
;
478 y_offset
+= 8*(s
->mb_y
>> MB_FIELD
);
481 /* don't optimize for luma-only case, since B-frames usually
482 * use implicit weights => chroma too. */
483 uint8_t *tmp_cb
= s
->obmc_scratchpad
;
484 uint8_t *tmp_cr
= s
->obmc_scratchpad
+ 8;
485 uint8_t *tmp_y
= s
->obmc_scratchpad
+ 8*h
->mb_uvlinesize
;
486 int refn0
= h
->ref_cache
[0][ scan8
[n
] ];
487 int refn1
= h
->ref_cache
[1][ scan8
[n
] ];
489 mc_dir_part(h
, &h
->ref_list
[0][refn0
], n
, square
, chroma_height
, delta
, 0,
490 dest_y
, dest_cb
, dest_cr
,
491 x_offset
, y_offset
, qpix_put
, chroma_put
);
492 mc_dir_part(h
, &h
->ref_list
[1][refn1
], n
, square
, chroma_height
, delta
, 1,
493 tmp_y
, tmp_cb
, tmp_cr
,
494 x_offset
, y_offset
, qpix_put
, chroma_put
);
496 if(h
->use_weight
== 2){
497 int weight0
= h
->implicit_weight
[refn0
][refn1
];
498 int weight1
= 64 - weight0
;
499 luma_weight_avg( dest_y
, tmp_y
, h
-> mb_linesize
, 5, weight0
, weight1
, 0);
500 chroma_weight_avg(dest_cb
, tmp_cb
, h
->mb_uvlinesize
, 5, weight0
, weight1
, 0);
501 chroma_weight_avg(dest_cr
, tmp_cr
, h
->mb_uvlinesize
, 5, weight0
, weight1
, 0);
503 luma_weight_avg(dest_y
, tmp_y
, h
->mb_linesize
, h
->luma_log2_weight_denom
,
504 h
->luma_weight
[0][refn0
], h
->luma_weight
[1][refn1
],
505 h
->luma_offset
[0][refn0
] + h
->luma_offset
[1][refn1
]);
506 chroma_weight_avg(dest_cb
, tmp_cb
, h
->mb_uvlinesize
, h
->chroma_log2_weight_denom
,
507 h
->chroma_weight
[0][refn0
][0], h
->chroma_weight
[1][refn1
][0],
508 h
->chroma_offset
[0][refn0
][0] + h
->chroma_offset
[1][refn1
][0]);
509 chroma_weight_avg(dest_cr
, tmp_cr
, h
->mb_uvlinesize
, h
->chroma_log2_weight_denom
,
510 h
->chroma_weight
[0][refn0
][1], h
->chroma_weight
[1][refn1
][1],
511 h
->chroma_offset
[0][refn0
][1] + h
->chroma_offset
[1][refn1
][1]);
514 int list
= list1 ?
1 : 0;
515 int refn
= h
->ref_cache
[list
][ scan8
[n
] ];
516 Picture
*ref
= &h
->ref_list
[list
][refn
];
517 mc_dir_part(h
, ref
, n
, square
, chroma_height
, delta
, list
,
518 dest_y
, dest_cb
, dest_cr
, x_offset
, y_offset
,
519 qpix_put
, chroma_put
);
521 luma_weight_op(dest_y
, h
->mb_linesize
, h
->luma_log2_weight_denom
,
522 h
->luma_weight
[list
][refn
], h
->luma_offset
[list
][refn
]);
523 if(h
->use_weight_chroma
){
524 chroma_weight_op(dest_cb
, h
->mb_uvlinesize
, h
->chroma_log2_weight_denom
,
525 h
->chroma_weight
[list
][refn
][0], h
->chroma_offset
[list
][refn
][0]);
526 chroma_weight_op(dest_cr
, h
->mb_uvlinesize
, h
->chroma_log2_weight_denom
,
527 h
->chroma_weight
[list
][refn
][1], h
->chroma_offset
[list
][refn
][1]);
532 static inline void mc_part(H264Context
*h
, int n
, int square
, int chroma_height
, int delta
,
533 uint8_t *dest_y
, uint8_t *dest_cb
, uint8_t *dest_cr
,
534 int x_offset
, int y_offset
,
535 qpel_mc_func
*qpix_put
, h264_chroma_mc_func chroma_put
,
536 qpel_mc_func
*qpix_avg
, h264_chroma_mc_func chroma_avg
,
537 h264_weight_func
*weight_op
, h264_biweight_func
*weight_avg
,
538 int list0
, int list1
){
539 if((h
->use_weight
==2 && list0
&& list1
540 && (h
->implicit_weight
[ h
->ref_cache
[0][scan8
[n
]] ][ h
->ref_cache
[1][scan8
[n
]] ] != 32))
542 mc_part_weighted(h
, n
, square
, chroma_height
, delta
, dest_y
, dest_cb
, dest_cr
,
543 x_offset
, y_offset
, qpix_put
, chroma_put
,
544 weight_op
[0], weight_op
[3], weight_avg
[0], weight_avg
[3], list0
, list1
);
546 mc_part_std(h
, n
, square
, chroma_height
, delta
, dest_y
, dest_cb
, dest_cr
,
547 x_offset
, y_offset
, qpix_put
, chroma_put
, qpix_avg
, chroma_avg
, list0
, list1
);
550 static inline void prefetch_motion(H264Context
*h
, int list
){
551 /* fetch pixels for estimated mv 4 macroblocks ahead
552 * optimized for 64byte cache lines */
553 MpegEncContext
* const s
= &h
->s
;
554 const int refn
= h
->ref_cache
[list
][scan8
[0]];
556 const int mx
= (h
->mv_cache
[list
][scan8
[0]][0]>>2) + 16*s
->mb_x
+ 8;
557 const int my
= (h
->mv_cache
[list
][scan8
[0]][1]>>2) + 16*s
->mb_y
;
558 uint8_t **src
= h
->ref_list
[list
][refn
].data
;
559 int off
= mx
+ (my
+ (s
->mb_x
&3)*4)*h
->mb_linesize
+ 64;
560 s
->dsp
.prefetch(src
[0]+off
, s
->linesize
, 4);
561 off
= (mx
>>1) + ((my
>>1) + (s
->mb_x
&7))*s
->uvlinesize
+ 64;
562 s
->dsp
.prefetch(src
[1]+off
, src
[2]-src
[1], 2);
566 static void hl_motion(H264Context
*h
, uint8_t *dest_y
, uint8_t *dest_cb
, uint8_t *dest_cr
,
567 qpel_mc_func (*qpix_put
)[16], h264_chroma_mc_func (*chroma_put
),
568 qpel_mc_func (*qpix_avg
)[16], h264_chroma_mc_func (*chroma_avg
),
569 h264_weight_func
*weight_op
, h264_biweight_func
*weight_avg
){
570 MpegEncContext
* const s
= &h
->s
;
571 const int mb_xy
= h
->mb_xy
;
572 const int mb_type
= s
->current_picture
.mb_type
[mb_xy
];
574 assert(IS_INTER(mb_type
));
576 prefetch_motion(h
, 0);
578 if(IS_16X16(mb_type
)){
579 mc_part(h
, 0, 1, 8, 0, dest_y
, dest_cb
, dest_cr
, 0, 0,
580 qpix_put
[0], chroma_put
[0], qpix_avg
[0], chroma_avg
[0],
581 weight_op
, weight_avg
,
582 IS_DIR(mb_type
, 0, 0), IS_DIR(mb_type
, 0, 1));
583 }else if(IS_16X8(mb_type
)){
584 mc_part(h
, 0, 0, 4, 8, dest_y
, dest_cb
, dest_cr
, 0, 0,
585 qpix_put
[1], chroma_put
[0], qpix_avg
[1], chroma_avg
[0],
586 &weight_op
[1], &weight_avg
[1],
587 IS_DIR(mb_type
, 0, 0), IS_DIR(mb_type
, 0, 1));
588 mc_part(h
, 8, 0, 4, 8, dest_y
, dest_cb
, dest_cr
, 0, 4,
589 qpix_put
[1], chroma_put
[0], qpix_avg
[1], chroma_avg
[0],
590 &weight_op
[1], &weight_avg
[1],
591 IS_DIR(mb_type
, 1, 0), IS_DIR(mb_type
, 1, 1));
592 }else if(IS_8X16(mb_type
)){
593 mc_part(h
, 0, 0, 8, 8*h
->mb_linesize
, dest_y
, dest_cb
, dest_cr
, 0, 0,
594 qpix_put
[1], chroma_put
[1], qpix_avg
[1], chroma_avg
[1],
595 &weight_op
[2], &weight_avg
[2],
596 IS_DIR(mb_type
, 0, 0), IS_DIR(mb_type
, 0, 1));
597 mc_part(h
, 4, 0, 8, 8*h
->mb_linesize
, dest_y
, dest_cb
, dest_cr
, 4, 0,
598 qpix_put
[1], chroma_put
[1], qpix_avg
[1], chroma_avg
[1],
599 &weight_op
[2], &weight_avg
[2],
600 IS_DIR(mb_type
, 1, 0), IS_DIR(mb_type
, 1, 1));
604 assert(IS_8X8(mb_type
));
607 const int sub_mb_type
= h
->sub_mb_type
[i
];
609 int x_offset
= (i
&1)<<2;
610 int y_offset
= (i
&2)<<1;
612 if(IS_SUB_8X8(sub_mb_type
)){
613 mc_part(h
, n
, 1, 4, 0, dest_y
, dest_cb
, dest_cr
, x_offset
, y_offset
,
614 qpix_put
[1], chroma_put
[1], qpix_avg
[1], chroma_avg
[1],
615 &weight_op
[3], &weight_avg
[3],
616 IS_DIR(sub_mb_type
, 0, 0), IS_DIR(sub_mb_type
, 0, 1));
617 }else if(IS_SUB_8X4(sub_mb_type
)){
618 mc_part(h
, n
, 0, 2, 4, dest_y
, dest_cb
, dest_cr
, x_offset
, y_offset
,
619 qpix_put
[2], chroma_put
[1], qpix_avg
[2], chroma_avg
[1],
620 &weight_op
[4], &weight_avg
[4],
621 IS_DIR(sub_mb_type
, 0, 0), IS_DIR(sub_mb_type
, 0, 1));
622 mc_part(h
, n
+2, 0, 2, 4, dest_y
, dest_cb
, dest_cr
, x_offset
, y_offset
+2,
623 qpix_put
[2], chroma_put
[1], qpix_avg
[2], chroma_avg
[1],
624 &weight_op
[4], &weight_avg
[4],
625 IS_DIR(sub_mb_type
, 0, 0), IS_DIR(sub_mb_type
, 0, 1));
626 }else if(IS_SUB_4X8(sub_mb_type
)){
627 mc_part(h
, n
, 0, 4, 4*h
->mb_linesize
, dest_y
, dest_cb
, dest_cr
, x_offset
, y_offset
,
628 qpix_put
[2], chroma_put
[2], qpix_avg
[2], chroma_avg
[2],
629 &weight_op
[5], &weight_avg
[5],
630 IS_DIR(sub_mb_type
, 0, 0), IS_DIR(sub_mb_type
, 0, 1));
631 mc_part(h
, n
+1, 0, 4, 4*h
->mb_linesize
, dest_y
, dest_cb
, dest_cr
, x_offset
+2, y_offset
,
632 qpix_put
[2], chroma_put
[2], qpix_avg
[2], chroma_avg
[2],
633 &weight_op
[5], &weight_avg
[5],
634 IS_DIR(sub_mb_type
, 0, 0), IS_DIR(sub_mb_type
, 0, 1));
637 assert(IS_SUB_4X4(sub_mb_type
));
639 int sub_x_offset
= x_offset
+ 2*(j
&1);
640 int sub_y_offset
= y_offset
+ (j
&2);
641 mc_part(h
, n
+j
, 1, 2, 0, dest_y
, dest_cb
, dest_cr
, sub_x_offset
, sub_y_offset
,
642 qpix_put
[2], chroma_put
[2], qpix_avg
[2], chroma_avg
[2],
643 &weight_op
[6], &weight_avg
[6],
644 IS_DIR(sub_mb_type
, 0, 0), IS_DIR(sub_mb_type
, 0, 1));
650 prefetch_motion(h
, 1);
654 static void free_tables(H264Context
*h
){
657 av_freep(&h
->intra4x4_pred_mode
);
658 av_freep(&h
->chroma_pred_mode_table
);
659 av_freep(&h
->cbp_table
);
660 av_freep(&h
->mvd_table
[0]);
661 av_freep(&h
->mvd_table
[1]);
662 av_freep(&h
->direct_table
);
663 av_freep(&h
->non_zero_count
);
664 av_freep(&h
->slice_table_base
);
665 h
->slice_table
= NULL
;
666 av_freep(&h
->list_counts
);
668 av_freep(&h
->mb2b_xy
);
669 av_freep(&h
->mb2b8_xy
);
671 for(i
= 0; i
< MAX_THREADS
; i
++) {
672 hx
= h
->thread_context
[i
];
674 av_freep(&hx
->top_borders
[1]);
675 av_freep(&hx
->top_borders
[0]);
676 av_freep(&hx
->s
.obmc_scratchpad
);
677 av_freep(&hx
->rbsp_buffer
[1]);
678 av_freep(&hx
->rbsp_buffer
[0]);
679 hx
->rbsp_buffer_size
[0] = 0;
680 hx
->rbsp_buffer_size
[1] = 0;
681 if (i
) av_freep(&h
->thread_context
[i
]);
685 static void init_dequant8_coeff_table(H264Context
*h
){
687 const int transpose
= (h
->s
.dsp
.h264_idct8_add
!= ff_h264_idct8_add_c
); //FIXME ugly
688 h
->dequant8_coeff
[0] = h
->dequant8_buffer
[0];
689 h
->dequant8_coeff
[1] = h
->dequant8_buffer
[1];
692 if(i
&& !memcmp(h
->pps
.scaling_matrix8
[0], h
->pps
.scaling_matrix8
[1], 64*sizeof(uint8_t))){
693 h
->dequant8_coeff
[1] = h
->dequant8_buffer
[0];
701 h
->dequant8_coeff
[i
][q
][transpose ?
(x
>>3)|((x
&7)<<3) : x
] =
702 ((uint32_t)dequant8_coeff_init
[idx
][ dequant8_coeff_init_scan
[((x
>>1)&12) | (x
&3)] ] *
703 h
->pps
.scaling_matrix8
[i
][x
]) << shift
;
708 static void init_dequant4_coeff_table(H264Context
*h
){
710 const int transpose
= (h
->s
.dsp
.h264_idct_add
!= ff_h264_idct_add_c
); //FIXME ugly
712 h
->dequant4_coeff
[i
] = h
->dequant4_buffer
[i
];
714 if(!memcmp(h
->pps
.scaling_matrix4
[j
], h
->pps
.scaling_matrix4
[i
], 16*sizeof(uint8_t))){
715 h
->dequant4_coeff
[i
] = h
->dequant4_buffer
[j
];
723 int shift
= div6
[q
] + 2;
726 h
->dequant4_coeff
[i
][q
][transpose ?
(x
>>2)|((x
<<2)&0xF) : x
] =
727 ((uint32_t)dequant4_coeff_init
[idx
][(x
&1) + ((x
>>2)&1)] *
728 h
->pps
.scaling_matrix4
[i
][x
]) << shift
;
733 static void init_dequant_tables(H264Context
*h
){
735 init_dequant4_coeff_table(h
);
736 if(h
->pps
.transform_8x8_mode
)
737 init_dequant8_coeff_table(h
);
738 if(h
->sps
.transform_bypass
){
741 h
->dequant4_coeff
[i
][0][x
] = 1<<6;
742 if(h
->pps
.transform_8x8_mode
)
745 h
->dequant8_coeff
[i
][0][x
] = 1<<6;
750 int ff_h264_alloc_tables(H264Context
*h
){
751 MpegEncContext
* const s
= &h
->s
;
752 const int big_mb_num
= s
->mb_stride
* (s
->mb_height
+1);
755 FF_ALLOCZ_OR_GOTO(h
->s
.avctx
, h
->intra4x4_pred_mode
, big_mb_num
* 8 * sizeof(uint8_t), fail
)
757 FF_ALLOCZ_OR_GOTO(h
->s
.avctx
, h
->non_zero_count
, big_mb_num
* 32 * sizeof(uint8_t), fail
)
758 FF_ALLOCZ_OR_GOTO(h
->s
.avctx
, h
->slice_table_base
, (big_mb_num
+s
->mb_stride
) * sizeof(*h
->slice_table_base
), fail
)
759 FF_ALLOCZ_OR_GOTO(h
->s
.avctx
, h
->cbp_table
, big_mb_num
* sizeof(uint16_t), fail
)
761 FF_ALLOCZ_OR_GOTO(h
->s
.avctx
, h
->chroma_pred_mode_table
, big_mb_num
* sizeof(uint8_t), fail
)
762 FF_ALLOCZ_OR_GOTO(h
->s
.avctx
, h
->mvd_table
[0], 32*big_mb_num
* sizeof(uint16_t), fail
);
763 FF_ALLOCZ_OR_GOTO(h
->s
.avctx
, h
->mvd_table
[1], 32*big_mb_num
* sizeof(uint16_t), fail
);
764 FF_ALLOCZ_OR_GOTO(h
->s
.avctx
, h
->direct_table
, 32*big_mb_num
* sizeof(uint8_t) , fail
);
765 FF_ALLOCZ_OR_GOTO(h
->s
.avctx
, h
->list_counts
, big_mb_num
* sizeof(uint8_t), fail
)
767 memset(h
->slice_table_base
, -1, (big_mb_num
+s
->mb_stride
) * sizeof(*h
->slice_table_base
));
768 h
->slice_table
= h
->slice_table_base
+ s
->mb_stride
*2 + 1;
770 FF_ALLOCZ_OR_GOTO(h
->s
.avctx
, h
->mb2b_xy
, big_mb_num
* sizeof(uint32_t), fail
);
771 FF_ALLOCZ_OR_GOTO(h
->s
.avctx
, h
->mb2b8_xy
, big_mb_num
* sizeof(uint32_t), fail
);
772 for(y
=0; y
<s
->mb_height
; y
++){
773 for(x
=0; x
<s
->mb_width
; x
++){
774 const int mb_xy
= x
+ y
*s
->mb_stride
;
775 const int b_xy
= 4*x
+ 4*y
*h
->b_stride
;
776 const int b8_xy
= 2*x
+ 2*y
*h
->b8_stride
;
778 h
->mb2b_xy
[mb_xy
]= b_xy
;
779 h
->mb2b8_xy
[mb_xy
]= b8_xy
;
783 s
->obmc_scratchpad
= NULL
;
785 if(!h
->dequant4_coeff
[0])
786 init_dequant_tables(h
);
795 * Mimic alloc_tables(), but for every context thread.
797 static void clone_tables(H264Context
*dst
, H264Context
*src
){
798 dst
->intra4x4_pred_mode
= src
->intra4x4_pred_mode
;
799 dst
->non_zero_count
= src
->non_zero_count
;
800 dst
->slice_table
= src
->slice_table
;
801 dst
->cbp_table
= src
->cbp_table
;
802 dst
->mb2b_xy
= src
->mb2b_xy
;
803 dst
->mb2b8_xy
= src
->mb2b8_xy
;
804 dst
->chroma_pred_mode_table
= src
->chroma_pred_mode_table
;
805 dst
->mvd_table
[0] = src
->mvd_table
[0];
806 dst
->mvd_table
[1] = src
->mvd_table
[1];
807 dst
->direct_table
= src
->direct_table
;
808 dst
->list_counts
= src
->list_counts
;
810 dst
->s
.obmc_scratchpad
= NULL
;
811 ff_h264_pred_init(&dst
->hpc
, src
->s
.codec_id
);
816 * Allocate buffers which are not shared amongst multiple threads.
818 static int context_init(H264Context
*h
){
819 FF_ALLOCZ_OR_GOTO(h
->s
.avctx
, h
->top_borders
[0], h
->s
.mb_width
* (16+8+8) * sizeof(uint8_t), fail
)
820 FF_ALLOCZ_OR_GOTO(h
->s
.avctx
, h
->top_borders
[1], h
->s
.mb_width
* (16+8+8) * sizeof(uint8_t), fail
)
824 return -1; // free_tables will clean up for us
827 static av_cold
void common_init(H264Context
*h
){
828 MpegEncContext
* const s
= &h
->s
;
830 s
->width
= s
->avctx
->width
;
831 s
->height
= s
->avctx
->height
;
832 s
->codec_id
= s
->avctx
->codec
->id
;
834 ff_h264_pred_init(&h
->hpc
, s
->codec_id
);
836 h
->dequant_coeff_pps
= -1;
837 s
->unrestricted_mv
=1;
840 dsputil_init(&s
->dsp
, s
->avctx
); // needed so that idct permutation is known early
842 memset(h
->pps
.scaling_matrix4
, 16, 6*16*sizeof(uint8_t));
843 memset(h
->pps
.scaling_matrix8
, 16, 2*64*sizeof(uint8_t));
846 av_cold
int ff_h264_decode_init(AVCodecContext
*avctx
){
847 H264Context
*h
= avctx
->priv_data
;
848 MpegEncContext
* const s
= &h
->s
;
850 MPV_decode_defaults(s
);
855 s
->out_format
= FMT_H264
;
856 s
->workaround_bugs
= avctx
->workaround_bugs
;
859 // s->decode_mb= ff_h263_decode_mb;
860 s
->quarter_sample
= 1;
861 if(!avctx
->has_b_frames
)
864 avctx
->chroma_sample_location
= AVCHROMA_LOC_LEFT
;
866 ff_h264_decode_init_vlc();
868 if(avctx
->extradata_size
> 0 && avctx
->extradata
&&
869 *(char *)avctx
->extradata
== 1){
876 h
->thread_context
[0] = h
;
877 h
->outputed_poc
= INT_MIN
;
878 h
->prev_poc_msb
= 1<<16;
879 ff_h264_reset_sei(h
);
880 if(avctx
->codec_id
== CODEC_ID_H264
){
881 if(avctx
->ticks_per_frame
== 1){
882 s
->avctx
->time_base
.den
*=2;
884 avctx
->ticks_per_frame
= 2;
889 int ff_h264_frame_start(H264Context
*h
){
890 MpegEncContext
* const s
= &h
->s
;
893 if(MPV_frame_start(s
, s
->avctx
) < 0)
895 ff_er_frame_start(s
);
897 * MPV_frame_start uses pict_type to derive key_frame.
898 * This is incorrect for H.264; IDR markings must be used.
899 * Zero here; IDR markings per slice in frame or fields are ORed in later.
900 * See decode_nal_units().
902 s
->current_picture_ptr
->key_frame
= 0;
903 s
->current_picture_ptr
->mmco_reset
= 0;
905 assert(s
->linesize
&& s
->uvlinesize
);
908 h
->block_offset
[i
]= 4*((scan8
[i
] - scan8
[0])&7) + 4*s
->linesize
*((scan8
[i
] - scan8
[0])>>3);
909 h
->block_offset
[24+i
]= 4*((scan8
[i
] - scan8
[0])&7) + 8*s
->linesize
*((scan8
[i
] - scan8
[0])>>3);
912 h
->block_offset
[16+i
]=
913 h
->block_offset
[20+i
]= 4*((scan8
[i
] - scan8
[0])&7) + 4*s
->uvlinesize
*((scan8
[i
] - scan8
[0])>>3);
914 h
->block_offset
[24+16+i
]=
915 h
->block_offset
[24+20+i
]= 4*((scan8
[i
] - scan8
[0])&7) + 8*s
->uvlinesize
*((scan8
[i
] - scan8
[0])>>3);
918 /* can't be in alloc_tables because linesize isn't known there.
919 * FIXME: redo bipred weight to not require extra buffer? */
920 for(i
= 0; i
< s
->avctx
->thread_count
; i
++)
921 if(!h
->thread_context
[i
]->s
.obmc_scratchpad
)
922 h
->thread_context
[i
]->s
.obmc_scratchpad
= av_malloc(16*2*s
->linesize
+ 8*2*s
->uvlinesize
);
924 /* some macroblocks will be accessed before they're available */
925 if(FRAME_MBAFF
|| s
->avctx
->thread_count
> 1)
926 memset(h
->slice_table
, -1, (s
->mb_height
*s
->mb_stride
-1) * sizeof(*h
->slice_table
));
928 // s->decode= (s->flags&CODEC_FLAG_PSNR) || !s->encoding || s->current_picture.reference /*|| h->contains_intra*/ || 1;
930 // We mark the current picture as non-reference after allocating it, so
931 // that if we break out due to an error it can be released automatically
932 // in the next MPV_frame_start().
933 // SVQ3 as well as most other codecs have only last/next/current and thus
934 // get released even with set reference, besides SVQ3 and others do not
935 // mark frames as reference later "naturally".
936 if(s
->codec_id
!= CODEC_ID_SVQ3
)
937 s
->current_picture_ptr
->reference
= 0;
939 s
->current_picture_ptr
->field_poc
[0]=
940 s
->current_picture_ptr
->field_poc
[1]= INT_MAX
;
941 assert(s
->current_picture_ptr
->long_ref
==0);
946 static inline void backup_mb_border(H264Context
*h
, uint8_t *src_y
, uint8_t *src_cb
, uint8_t *src_cr
, int linesize
, int uvlinesize
, int simple
){
947 MpegEncContext
* const s
= &h
->s
;
952 src_cb
-= uvlinesize
;
953 src_cr
-= uvlinesize
;
955 if(!simple
&& FRAME_MBAFF
){
958 top_border
= h
->top_borders
[0][s
->mb_x
];
959 AV_COPY128(top_border
, src_y
+ 15*linesize
);
960 if(simple
|| !CONFIG_GRAY
|| !(s
->flags
&CODEC_FLAG_GRAY
)){
961 AV_COPY64(top_border
+16, src_cb
+7*uvlinesize
);
962 AV_COPY64(top_border
+24, src_cr
+7*uvlinesize
);
971 top_border
= h
->top_borders
[top_idx
][s
->mb_x
];
972 // There are two lines saved, the line above the the top macroblock of a pair,
973 // and the line above the bottom macroblock
974 AV_COPY128(top_border
, src_y
+ 16*linesize
);
976 if(simple
|| !CONFIG_GRAY
|| !(s
->flags
&CODEC_FLAG_GRAY
)){
977 AV_COPY64(top_border
+16, src_cb
+8*uvlinesize
);
978 AV_COPY64(top_border
+24, src_cr
+8*uvlinesize
);
982 static inline void xchg_mb_border(H264Context
*h
, uint8_t *src_y
, uint8_t *src_cb
, uint8_t *src_cr
, int linesize
, int uvlinesize
, int xchg
, int simple
){
983 MpegEncContext
* const s
= &h
->s
;
990 uint8_t *top_border_m1
;
993 if(!simple
&& FRAME_MBAFF
){
998 top_idx
= MB_MBAFF ?
0 : 1;
1002 if(h
->deblocking_filter
== 2) {
1004 deblock_left
= h
->slice_table
[mb_xy
] == h
->slice_table
[mb_xy
- 1];
1005 deblock_top
= h
->slice_table
[mb_xy
] == h
->slice_table
[h
->top_mb_xy
];
1007 deblock_left
= (s
->mb_x
> 0);
1008 deblock_top
= (s
->mb_y
> !!MB_FIELD
);
1011 src_y
-= linesize
+ 1;
1012 src_cb
-= uvlinesize
+ 1;
1013 src_cr
-= uvlinesize
+ 1;
1015 top_border_m1
= h
->top_borders
[top_idx
][s
->mb_x
-1];
1016 top_border
= h
->top_borders
[top_idx
][s
->mb_x
];
1018 #define XCHG(a,b,xchg)\
1019 if (xchg) AV_SWAP64(b,a);\
1020 else AV_COPY64(b,a);
1024 XCHG(top_border_m1
+8, src_y
-7, 1);
1026 XCHG(top_border
+0, src_y
+1, xchg
);
1027 XCHG(top_border
+8, src_y
+9, 1);
1028 if(s
->mb_x
+1 < s
->mb_width
){
1029 XCHG(h
->top_borders
[top_idx
][s
->mb_x
+1], src_y
+17, 1);
1033 if(simple
|| !CONFIG_GRAY
|| !(s
->flags
&CODEC_FLAG_GRAY
)){
1036 XCHG(top_border_m1
+16, src_cb
-7, 1);
1037 XCHG(top_border_m1
+24, src_cr
-7, 1);
1039 XCHG(top_border
+16, src_cb
+1, 1);
1040 XCHG(top_border
+24, src_cr
+1, 1);
1045 static av_always_inline
void hl_decode_mb_internal(H264Context
*h
, int simple
){
1046 MpegEncContext
* const s
= &h
->s
;
1047 const int mb_x
= s
->mb_x
;
1048 const int mb_y
= s
->mb_y
;
1049 const int mb_xy
= h
->mb_xy
;
1050 const int mb_type
= s
->current_picture
.mb_type
[mb_xy
];
1051 uint8_t *dest_y
, *dest_cb
, *dest_cr
;
1052 int linesize
, uvlinesize
/*dct_offset*/;
1054 int *block_offset
= &h
->block_offset
[0];
1055 const int transform_bypass
= !simple
&& (s
->qscale
== 0 && h
->sps
.transform_bypass
);
1056 /* is_h264 should always be true if SVQ3 is disabled. */
1057 const int is_h264
= !CONFIG_SVQ3_DECODER
|| simple
|| s
->codec_id
== CODEC_ID_H264
;
1058 void (*idct_add
)(uint8_t *dst
, DCTELEM
*block
, int stride
);
1059 void (*idct_dc_add
)(uint8_t *dst
, DCTELEM
*block
, int stride
);
1061 dest_y
= s
->current_picture
.data
[0] + (mb_x
+ mb_y
* s
->linesize
) * 16;
1062 dest_cb
= s
->current_picture
.data
[1] + (mb_x
+ mb_y
* s
->uvlinesize
) * 8;
1063 dest_cr
= s
->current_picture
.data
[2] + (mb_x
+ mb_y
* s
->uvlinesize
) * 8;
1065 s
->dsp
.prefetch(dest_y
+ (s
->mb_x
&3)*4*s
->linesize
+ 64, s
->linesize
, 4);
1066 s
->dsp
.prefetch(dest_cb
+ (s
->mb_x
&7)*s
->uvlinesize
+ 64, dest_cr
- dest_cb
, 2);
1068 h
->list_counts
[mb_xy
]= h
->list_count
;
1070 if (!simple
&& MB_FIELD
) {
1071 linesize
= h
->mb_linesize
= s
->linesize
* 2;
1072 uvlinesize
= h
->mb_uvlinesize
= s
->uvlinesize
* 2;
1073 block_offset
= &h
->block_offset
[24];
1074 if(mb_y
&1){ //FIXME move out of this function?
1075 dest_y
-= s
->linesize
*15;
1076 dest_cb
-= s
->uvlinesize
*7;
1077 dest_cr
-= s
->uvlinesize
*7;
1081 for(list
=0; list
<h
->list_count
; list
++){
1082 if(!USES_LIST(mb_type
, list
))
1084 if(IS_16X16(mb_type
)){
1085 int8_t *ref
= &h
->ref_cache
[list
][scan8
[0]];
1086 fill_rectangle(ref
, 4, 4, 8, (16+*ref
)^(s
->mb_y
&1), 1);
1088 for(i
=0; i
<16; i
+=4){
1089 int ref
= h
->ref_cache
[list
][scan8
[i
]];
1091 fill_rectangle(&h
->ref_cache
[list
][scan8
[i
]], 2, 2, 8, (16+ref
)^(s
->mb_y
&1), 1);
1097 linesize
= h
->mb_linesize
= s
->linesize
;
1098 uvlinesize
= h
->mb_uvlinesize
= s
->uvlinesize
;
1099 // dct_offset = s->linesize * 16;
1102 if (!simple
&& IS_INTRA_PCM(mb_type
)) {
1103 for (i
=0; i
<16; i
++) {
1104 memcpy(dest_y
+ i
* linesize
, h
->mb
+ i
*8, 16);
1106 for (i
=0; i
<8; i
++) {
1107 memcpy(dest_cb
+ i
*uvlinesize
, h
->mb
+ 128 + i
*4, 8);
1108 memcpy(dest_cr
+ i
*uvlinesize
, h
->mb
+ 160 + i
*4, 8);
1111 if(IS_INTRA(mb_type
)){
1112 if(h
->deblocking_filter
)
1113 xchg_mb_border(h
, dest_y
, dest_cb
, dest_cr
, linesize
, uvlinesize
, 1, simple
);
1115 if(simple
|| !CONFIG_GRAY
|| !(s
->flags
&CODEC_FLAG_GRAY
)){
1116 h
->hpc
.pred8x8
[ h
->chroma_pred_mode
](dest_cb
, uvlinesize
);
1117 h
->hpc
.pred8x8
[ h
->chroma_pred_mode
](dest_cr
, uvlinesize
);
1120 if(IS_INTRA4x4(mb_type
)){
1121 if(simple
|| !s
->encoding
){
1122 if(IS_8x8DCT(mb_type
)){
1123 if(transform_bypass
){
1125 idct_add
= s
->dsp
.add_pixels8
;
1127 idct_dc_add
= s
->dsp
.h264_idct8_dc_add
;
1128 idct_add
= s
->dsp
.h264_idct8_add
;
1130 for(i
=0; i
<16; i
+=4){
1131 uint8_t * const ptr
= dest_y
+ block_offset
[i
];
1132 const int dir
= h
->intra4x4_pred_mode_cache
[ scan8
[i
] ];
1133 if(transform_bypass
&& h
->sps
.profile_idc
==244 && dir
<=1){
1134 h
->hpc
.pred8x8l_add
[dir
](ptr
, h
->mb
+ i
*16, linesize
);
1136 const int nnz
= h
->non_zero_count_cache
[ scan8
[i
] ];
1137 h
->hpc
.pred8x8l
[ dir
](ptr
, (h
->topleft_samples_available
<<i
)&0x8000,
1138 (h
->topright_samples_available
<<i
)&0x4000, linesize
);
1140 if(nnz
== 1 && h
->mb
[i
*16])
1141 idct_dc_add(ptr
, h
->mb
+ i
*16, linesize
);
1143 idct_add (ptr
, h
->mb
+ i
*16, linesize
);
1148 if(transform_bypass
){
1150 idct_add
= s
->dsp
.add_pixels4
;
1152 idct_dc_add
= s
->dsp
.h264_idct_dc_add
;
1153 idct_add
= s
->dsp
.h264_idct_add
;
1155 for(i
=0; i
<16; i
++){
1156 uint8_t * const ptr
= dest_y
+ block_offset
[i
];
1157 const int dir
= h
->intra4x4_pred_mode_cache
[ scan8
[i
] ];
1159 if(transform_bypass
&& h
->sps
.profile_idc
==244 && dir
<=1){
1160 h
->hpc
.pred4x4_add
[dir
](ptr
, h
->mb
+ i
*16, linesize
);
1164 if(dir
== DIAG_DOWN_LEFT_PRED
|| dir
== VERT_LEFT_PRED
){
1165 const int topright_avail
= (h
->topright_samples_available
<<i
)&0x8000;
1166 assert(mb_y
|| linesize
<= block_offset
[i
]);
1167 if(!topright_avail
){
1168 tr
= ptr
[3 - linesize
]*0x01010101;
1169 topright
= (uint8_t*) &tr
;
1171 topright
= ptr
+ 4 - linesize
;
1175 h
->hpc
.pred4x4
[ dir
](ptr
, topright
, linesize
);
1176 nnz
= h
->non_zero_count_cache
[ scan8
[i
] ];
1179 if(nnz
== 1 && h
->mb
[i
*16])
1180 idct_dc_add(ptr
, h
->mb
+ i
*16, linesize
);
1182 idct_add (ptr
, h
->mb
+ i
*16, linesize
);
1184 svq3_add_idct_c(ptr
, h
->mb
+ i
*16, linesize
, s
->qscale
, 0);
1191 h
->hpc
.pred16x16
[ h
->intra16x16_pred_mode
](dest_y
, linesize
);
1193 if(!transform_bypass
)
1194 h264_luma_dc_dequant_idct_c(h
->mb
, s
->qscale
, h
->dequant4_coeff
[0][s
->qscale
][0]);
1196 svq3_luma_dc_dequant_idct_c(h
->mb
, s
->qscale
);
1198 if(h
->deblocking_filter
)
1199 xchg_mb_border(h
, dest_y
, dest_cb
, dest_cr
, linesize
, uvlinesize
, 0, simple
);
1201 hl_motion(h
, dest_y
, dest_cb
, dest_cr
,
1202 s
->me
.qpel_put
, s
->dsp
.put_h264_chroma_pixels_tab
,
1203 s
->me
.qpel_avg
, s
->dsp
.avg_h264_chroma_pixels_tab
,
1204 s
->dsp
.weight_h264_pixels_tab
, s
->dsp
.biweight_h264_pixels_tab
);
1208 if(!IS_INTRA4x4(mb_type
)){
1210 if(IS_INTRA16x16(mb_type
)){
1211 if(transform_bypass
){
1212 if(h
->sps
.profile_idc
==244 && (h
->intra16x16_pred_mode
==VERT_PRED8x8
|| h
->intra16x16_pred_mode
==HOR_PRED8x8
)){
1213 h
->hpc
.pred16x16_add
[h
->intra16x16_pred_mode
](dest_y
, block_offset
, h
->mb
, linesize
);
1215 for(i
=0; i
<16; i
++){
1216 if(h
->non_zero_count_cache
[ scan8
[i
] ] || h
->mb
[i
*16])
1217 s
->dsp
.add_pixels4(dest_y
+ block_offset
[i
], h
->mb
+ i
*16, linesize
);
1221 s
->dsp
.h264_idct_add16intra(dest_y
, block_offset
, h
->mb
, linesize
, h
->non_zero_count_cache
);
1223 }else if(h
->cbp
&15){
1224 if(transform_bypass
){
1225 const int di
= IS_8x8DCT(mb_type
) ?
4 : 1;
1226 idct_add
= IS_8x8DCT(mb_type
) ? s
->dsp
.add_pixels8
: s
->dsp
.add_pixels4
;
1227 for(i
=0; i
<16; i
+=di
){
1228 if(h
->non_zero_count_cache
[ scan8
[i
] ]){
1229 idct_add(dest_y
+ block_offset
[i
], h
->mb
+ i
*16, linesize
);
1233 if(IS_8x8DCT(mb_type
)){
1234 s
->dsp
.h264_idct8_add4(dest_y
, block_offset
, h
->mb
, linesize
, h
->non_zero_count_cache
);
1236 s
->dsp
.h264_idct_add16(dest_y
, block_offset
, h
->mb
, linesize
, h
->non_zero_count_cache
);
1241 for(i
=0; i
<16; i
++){
1242 if(h
->non_zero_count_cache
[ scan8
[i
] ] || h
->mb
[i
*16]){ //FIXME benchmark weird rule, & below
1243 uint8_t * const ptr
= dest_y
+ block_offset
[i
];
1244 svq3_add_idct_c(ptr
, h
->mb
+ i
*16, linesize
, s
->qscale
, IS_INTRA(mb_type
) ?
1 : 0);
1250 if((simple
|| !CONFIG_GRAY
|| !(s
->flags
&CODEC_FLAG_GRAY
)) && (h
->cbp
&0x30)){
1251 uint8_t *dest
[2] = {dest_cb
, dest_cr
};
1252 if(transform_bypass
){
1253 if(IS_INTRA(mb_type
) && h
->sps
.profile_idc
==244 && (h
->chroma_pred_mode
==VERT_PRED8x8
|| h
->chroma_pred_mode
==HOR_PRED8x8
)){
1254 h
->hpc
.pred8x8_add
[h
->chroma_pred_mode
](dest
[0], block_offset
+ 16, h
->mb
+ 16*16, uvlinesize
);
1255 h
->hpc
.pred8x8_add
[h
->chroma_pred_mode
](dest
[1], block_offset
+ 20, h
->mb
+ 20*16, uvlinesize
);
1257 idct_add
= s
->dsp
.add_pixels4
;
1258 for(i
=16; i
<16+8; i
++){
1259 if(h
->non_zero_count_cache
[ scan8
[i
] ] || h
->mb
[i
*16])
1260 idct_add (dest
[(i
&4)>>2] + block_offset
[i
], h
->mb
+ i
*16, uvlinesize
);
1264 chroma_dc_dequant_idct_c(h
->mb
+ 16*16, h
->chroma_qp
[0], h
->dequant4_coeff
[IS_INTRA(mb_type
) ?
1:4][h
->chroma_qp
[0]][0]);
1265 chroma_dc_dequant_idct_c(h
->mb
+ 16*16+4*16, h
->chroma_qp
[1], h
->dequant4_coeff
[IS_INTRA(mb_type
) ?
2:5][h
->chroma_qp
[1]][0]);
1267 idct_add
= s
->dsp
.h264_idct_add
;
1268 idct_dc_add
= s
->dsp
.h264_idct_dc_add
;
1269 for(i
=16; i
<16+8; i
++){
1270 if(h
->non_zero_count_cache
[ scan8
[i
] ])
1271 idct_add (dest
[(i
&4)>>2] + block_offset
[i
], h
->mb
+ i
*16, uvlinesize
);
1272 else if(h
->mb
[i
*16])
1273 idct_dc_add(dest
[(i
&4)>>2] + block_offset
[i
], h
->mb
+ i
*16, uvlinesize
);
1276 for(i
=16; i
<16+8; i
++){
1277 if(h
->non_zero_count_cache
[ scan8
[i
] ] || h
->mb
[i
*16]){
1278 uint8_t * const ptr
= dest
[(i
&4)>>2] + block_offset
[i
];
1279 svq3_add_idct_c(ptr
, h
->mb
+ i
*16, uvlinesize
, ff_h264_chroma_qp
[s
->qscale
+ 12] - 12, 2);
1286 if(h
->cbp
|| IS_INTRA(mb_type
))
1287 s
->dsp
.clear_blocks(h
->mb
);
1289 if(h
->deblocking_filter
&& 0) {
1290 backup_mb_border(h
, dest_y
, dest_cb
, dest_cr
, linesize
, uvlinesize
, simple
);
1291 fill_filter_caches(h
, mb_type
); //FIXME don't fill stuff which isn't used by filter_mb
1292 h
->chroma_qp
[0] = get_chroma_qp(h
, 0, s
->current_picture
.qscale_table
[mb_xy
]);
1293 h
->chroma_qp
[1] = get_chroma_qp(h
, 1, s
->current_picture
.qscale_table
[mb_xy
]);
1294 if (!simple
&& FRAME_MBAFF
) {
1295 ff_h264_filter_mb (h
, mb_x
, mb_y
, dest_y
, dest_cb
, dest_cr
, linesize
, uvlinesize
);
1297 ff_h264_filter_mb_fast(h
, mb_x
, mb_y
, dest_y
, dest_cb
, dest_cr
, linesize
, uvlinesize
);
1303 * Process a macroblock; this case avoids checks for expensive uncommon cases.
1305 static void hl_decode_mb_simple(H264Context
*h
){
1306 hl_decode_mb_internal(h
, 1);
1310 * Process a macroblock; this handles edge cases, such as interlacing.
1312 static void av_noinline
hl_decode_mb_complex(H264Context
*h
){
1313 hl_decode_mb_internal(h
, 0);
1316 void ff_h264_hl_decode_mb(H264Context
*h
){
1317 MpegEncContext
* const s
= &h
->s
;
1318 const int mb_xy
= h
->mb_xy
;
1319 const int mb_type
= s
->current_picture
.mb_type
[mb_xy
];
1320 int is_complex
= CONFIG_SMALL
|| h
->is_complex
|| IS_INTRA_PCM(mb_type
) || s
->qscale
== 0;
1323 hl_decode_mb_complex(h
);
1324 else hl_decode_mb_simple(h
);
1327 static int pred_weight_table(H264Context
*h
){
1328 MpegEncContext
* const s
= &h
->s
;
1330 int luma_def
, chroma_def
;
1333 h
->use_weight_chroma
= 0;
1334 h
->luma_log2_weight_denom
= get_ue_golomb(&s
->gb
);
1335 h
->chroma_log2_weight_denom
= get_ue_golomb(&s
->gb
);
1336 luma_def
= 1<<h
->luma_log2_weight_denom
;
1337 chroma_def
= 1<<h
->chroma_log2_weight_denom
;
1339 for(list
=0; list
<2; list
++){
1340 h
->luma_weight_flag
[list
] = 0;
1341 h
->chroma_weight_flag
[list
] = 0;
1342 for(i
=0; i
<h
->ref_count
[list
]; i
++){
1343 int luma_weight_flag
, chroma_weight_flag
;
1345 luma_weight_flag
= get_bits1(&s
->gb
);
1346 if(luma_weight_flag
){
1347 h
->luma_weight
[list
][i
]= get_se_golomb(&s
->gb
);
1348 h
->luma_offset
[list
][i
]= get_se_golomb(&s
->gb
);
1349 if( h
->luma_weight
[list
][i
] != luma_def
1350 || h
->luma_offset
[list
][i
] != 0) {
1352 h
->luma_weight_flag
[list
]= 1;
1355 h
->luma_weight
[list
][i
]= luma_def
;
1356 h
->luma_offset
[list
][i
]= 0;
1360 chroma_weight_flag
= get_bits1(&s
->gb
);
1361 if(chroma_weight_flag
){
1364 h
->chroma_weight
[list
][i
][j
]= get_se_golomb(&s
->gb
);
1365 h
->chroma_offset
[list
][i
][j
]= get_se_golomb(&s
->gb
);
1366 if( h
->chroma_weight
[list
][i
][j
] != chroma_def
1367 || h
->chroma_offset
[list
][i
][j
] != 0) {
1368 h
->use_weight_chroma
= 1;
1369 h
->chroma_weight_flag
[list
]= 1;
1375 h
->chroma_weight
[list
][i
][j
]= chroma_def
;
1376 h
->chroma_offset
[list
][i
][j
]= 0;
1381 if(h
->slice_type_nos
!= FF_B_TYPE
) break;
1383 h
->use_weight
= h
->use_weight
|| h
->use_weight_chroma
;
1387 static void implicit_weight_table(H264Context
*h
){
1388 MpegEncContext
* const s
= &h
->s
;
1390 int cur_poc
= s
->current_picture_ptr
->poc
;
1392 for (i
= 0; i
< 2; i
++) {
1393 h
->luma_weight_flag
[i
] = 0;
1394 h
->chroma_weight_flag
[i
] = 0;
1397 if( h
->ref_count
[0] == 1 && h
->ref_count
[1] == 1
1398 && h
->ref_list
[0][0].poc
+ h
->ref_list
[1][0].poc
== 2*cur_poc
){
1400 h
->use_weight_chroma
= 0;
1405 h
->use_weight_chroma
= 2;
1406 h
->luma_log2_weight_denom
= 5;
1407 h
->chroma_log2_weight_denom
= 5;
1409 for(ref0
=0; ref0
< h
->ref_count
[0]; ref0
++){
1410 int poc0
= h
->ref_list
[0][ref0
].poc
;
1411 for(ref1
=0; ref1
< h
->ref_count
[1]; ref1
++){
1412 int poc1
= h
->ref_list
[1][ref1
].poc
;
1413 int td
= av_clip(poc1
- poc0
, -128, 127);
1415 int tb
= av_clip(cur_poc
- poc0
, -128, 127);
1416 int tx
= (16384 + (FFABS(td
) >> 1)) / td
;
1417 int dist_scale_factor
= av_clip((tb
*tx
+ 32) >> 6, -1024, 1023) >> 2;
1418 if(dist_scale_factor
< -64 || dist_scale_factor
> 128)
1419 h
->implicit_weight
[ref0
][ref1
] = 32;
1421 h
->implicit_weight
[ref0
][ref1
] = 64 - dist_scale_factor
;
1423 h
->implicit_weight
[ref0
][ref1
] = 32;
1429 * instantaneous decoder refresh.
1431 static void idr(H264Context
*h
){
1432 ff_h264_remove_all_refs(h
);
1433 h
->prev_frame_num
= 0;
1434 h
->prev_frame_num_offset
= 0;
1439 /* forget old pics after a seek */
1440 static void flush_dpb(AVCodecContext
*avctx
){
1441 H264Context
*h
= avctx
->priv_data
;
1443 for(i
=0; i
<MAX_DELAYED_PIC_COUNT
; i
++) {
1444 if(h
->delayed_pic
[i
])
1445 h
->delayed_pic
[i
]->reference
= 0;
1446 h
->delayed_pic
[i
]= NULL
;
1448 h
->outputed_poc
= INT_MIN
;
1449 h
->prev_interlaced_frame
= 1;
1451 if(h
->s
.current_picture_ptr
)
1452 h
->s
.current_picture_ptr
->reference
= 0;
1453 h
->s
.first_field
= 0;
1454 ff_h264_reset_sei(h
);
1455 ff_mpeg_flush(avctx
);
1458 static int init_poc(H264Context
*h
){
1459 MpegEncContext
* const s
= &h
->s
;
1460 const int max_frame_num
= 1<<h
->sps
.log2_max_frame_num
;
1462 Picture
*cur
= s
->current_picture_ptr
;
1464 h
->frame_num_offset
= h
->prev_frame_num_offset
;
1465 if(h
->frame_num
< h
->prev_frame_num
)
1466 h
->frame_num_offset
+= max_frame_num
;
1468 if(h
->sps
.poc_type
==0){
1469 const int max_poc_lsb
= 1<<h
->sps
.log2_max_poc_lsb
;
1471 if (h
->poc_lsb
< h
->prev_poc_lsb
&& h
->prev_poc_lsb
- h
->poc_lsb
>= max_poc_lsb
/2)
1472 h
->poc_msb
= h
->prev_poc_msb
+ max_poc_lsb
;
1473 else if(h
->poc_lsb
> h
->prev_poc_lsb
&& h
->prev_poc_lsb
- h
->poc_lsb
< -max_poc_lsb
/2)
1474 h
->poc_msb
= h
->prev_poc_msb
- max_poc_lsb
;
1476 h
->poc_msb
= h
->prev_poc_msb
;
1477 //printf("poc: %d %d\n", h->poc_msb, h->poc_lsb);
1479 field_poc
[1] = h
->poc_msb
+ h
->poc_lsb
;
1480 if(s
->picture_structure
== PICT_FRAME
)
1481 field_poc
[1] += h
->delta_poc_bottom
;
1482 }else if(h
->sps
.poc_type
==1){
1483 int abs_frame_num
, expected_delta_per_poc_cycle
, expectedpoc
;
1486 if(h
->sps
.poc_cycle_length
!= 0)
1487 abs_frame_num
= h
->frame_num_offset
+ h
->frame_num
;
1491 if(h
->nal_ref_idc
==0 && abs_frame_num
> 0)
1494 expected_delta_per_poc_cycle
= 0;
1495 for(i
=0; i
< h
->sps
.poc_cycle_length
; i
++)
1496 expected_delta_per_poc_cycle
+= h
->sps
.offset_for_ref_frame
[ i
]; //FIXME integrate during sps parse
1498 if(abs_frame_num
> 0){
1499 int poc_cycle_cnt
= (abs_frame_num
- 1) / h
->sps
.poc_cycle_length
;
1500 int frame_num_in_poc_cycle
= (abs_frame_num
- 1) % h
->sps
.poc_cycle_length
;
1502 expectedpoc
= poc_cycle_cnt
* expected_delta_per_poc_cycle
;
1503 for(i
= 0; i
<= frame_num_in_poc_cycle
; i
++)
1504 expectedpoc
= expectedpoc
+ h
->sps
.offset_for_ref_frame
[ i
];
1508 if(h
->nal_ref_idc
== 0)
1509 expectedpoc
= expectedpoc
+ h
->sps
.offset_for_non_ref_pic
;
1511 field_poc
[0] = expectedpoc
+ h
->delta_poc
[0];
1512 field_poc
[1] = field_poc
[0] + h
->sps
.offset_for_top_to_bottom_field
;
1514 if(s
->picture_structure
== PICT_FRAME
)
1515 field_poc
[1] += h
->delta_poc
[1];
1517 int poc
= 2*(h
->frame_num_offset
+ h
->frame_num
);
1526 if(s
->picture_structure
!= PICT_BOTTOM_FIELD
)
1527 s
->current_picture_ptr
->field_poc
[0]= field_poc
[0];
1528 if(s
->picture_structure
!= PICT_TOP_FIELD
)
1529 s
->current_picture_ptr
->field_poc
[1]= field_poc
[1];
1530 cur
->poc
= FFMIN(cur
->field_poc
[0], cur
->field_poc
[1]);
1537 * initialize scan tables
1539 static void init_scan_tables(H264Context
*h
){
1540 MpegEncContext
* const s
= &h
->s
;
1542 if(s
->dsp
.h264_idct_add
== ff_h264_idct_add_c
){ //FIXME little ugly
1543 memcpy(h
->zigzag_scan
, zigzag_scan
, 16*sizeof(uint8_t));
1544 memcpy(h
-> field_scan
, field_scan
, 16*sizeof(uint8_t));
1546 for(i
=0; i
<16; i
++){
1547 #define T(x) (x>>2) | ((x<<2) & 0xF)
1548 h
->zigzag_scan
[i
] = T(zigzag_scan
[i
]);
1549 h
-> field_scan
[i
] = T( field_scan
[i
]);
1553 if(s
->dsp
.h264_idct8_add
== ff_h264_idct8_add_c
){
1554 memcpy(h
->zigzag_scan8x8
, ff_zigzag_direct
, 64*sizeof(uint8_t));
1555 memcpy(h
->zigzag_scan8x8_cavlc
, zigzag_scan8x8_cavlc
, 64*sizeof(uint8_t));
1556 memcpy(h
->field_scan8x8
, field_scan8x8
, 64*sizeof(uint8_t));
1557 memcpy(h
->field_scan8x8_cavlc
, field_scan8x8_cavlc
, 64*sizeof(uint8_t));
1559 for(i
=0; i
<64; i
++){
1560 #define T(x) (x>>3) | ((x&7)<<3)
1561 h
->zigzag_scan8x8
[i
] = T(ff_zigzag_direct
[i
]);
1562 h
->zigzag_scan8x8_cavlc
[i
] = T(zigzag_scan8x8_cavlc
[i
]);
1563 h
->field_scan8x8
[i
] = T(field_scan8x8
[i
]);
1564 h
->field_scan8x8_cavlc
[i
] = T(field_scan8x8_cavlc
[i
]);
1568 if(h
->sps
.transform_bypass
){ //FIXME same ugly
1569 h
->zigzag_scan_q0
= zigzag_scan
;
1570 h
->zigzag_scan8x8_q0
= ff_zigzag_direct
;
1571 h
->zigzag_scan8x8_cavlc_q0
= zigzag_scan8x8_cavlc
;
1572 h
->field_scan_q0
= field_scan
;
1573 h
->field_scan8x8_q0
= field_scan8x8
;
1574 h
->field_scan8x8_cavlc_q0
= field_scan8x8_cavlc
;
1576 h
->zigzag_scan_q0
= h
->zigzag_scan
;
1577 h
->zigzag_scan8x8_q0
= h
->zigzag_scan8x8
;
1578 h
->zigzag_scan8x8_cavlc_q0
= h
->zigzag_scan8x8_cavlc
;
1579 h
->field_scan_q0
= h
->field_scan
;
1580 h
->field_scan8x8_q0
= h
->field_scan8x8
;
1581 h
->field_scan8x8_cavlc_q0
= h
->field_scan8x8_cavlc
;
1585 static void field_end(H264Context
*h
){
1586 MpegEncContext
* const s
= &h
->s
;
1587 AVCodecContext
* const avctx
= s
->avctx
;
1590 s
->current_picture_ptr
->qscale_type
= FF_QSCALE_TYPE_H264
;
1591 s
->current_picture_ptr
->pict_type
= s
->pict_type
;
1593 if (CONFIG_H264_VDPAU_DECODER
&& s
->avctx
->codec
->capabilities
&CODEC_CAP_HWACCEL_VDPAU
)
1594 ff_vdpau_h264_set_reference_frames(s
);
1597 ff_h264_execute_ref_pic_marking(h
, h
->mmco
, h
->mmco_index
);
1598 h
->prev_poc_msb
= h
->poc_msb
;
1599 h
->prev_poc_lsb
= h
->poc_lsb
;
1601 h
->prev_frame_num_offset
= h
->frame_num_offset
;
1602 h
->prev_frame_num
= h
->frame_num
;
1604 if (avctx
->hwaccel
) {
1605 if (avctx
->hwaccel
->end_frame(avctx
) < 0)
1606 av_log(avctx
, AV_LOG_ERROR
, "hardware accelerator failed to decode picture\n");
1609 if (CONFIG_H264_VDPAU_DECODER
&& s
->avctx
->codec
->capabilities
&CODEC_CAP_HWACCEL_VDPAU
)
1610 ff_vdpau_h264_picture_complete(s
);
1613 * FIXME: Error handling code does not seem to support interlaced
1614 * when slices span multiple rows
1615 * The ff_er_add_slice calls don't work right for bottom
1616 * fields; they cause massive erroneous error concealing
1617 * Error marking covers both fields (top and bottom).
1618 * This causes a mismatched s->error_count
1619 * and a bad error table. Further, the error count goes to
1620 * INT_MAX when called for bottom field, because mb_y is
1621 * past end by one (callers fault) and resync_mb_y != 0
1622 * causes problems for the first MB line, too.
1633 * Replicates H264 "master" context to thread contexts.
1635 static void clone_slice(H264Context
*dst
, H264Context
*src
)
1637 memcpy(dst
->block_offset
, src
->block_offset
, sizeof(dst
->block_offset
));
1638 dst
->s
.current_picture_ptr
= src
->s
.current_picture_ptr
;
1639 dst
->s
.current_picture
= src
->s
.current_picture
;
1640 dst
->s
.linesize
= src
->s
.linesize
;
1641 dst
->s
.uvlinesize
= src
->s
.uvlinesize
;
1642 dst
->s
.first_field
= src
->s
.first_field
;
1644 dst
->prev_poc_msb
= src
->prev_poc_msb
;
1645 dst
->prev_poc_lsb
= src
->prev_poc_lsb
;
1646 dst
->prev_frame_num_offset
= src
->prev_frame_num_offset
;
1647 dst
->prev_frame_num
= src
->prev_frame_num
;
1648 dst
->short_ref_count
= src
->short_ref_count
;
1650 memcpy(dst
->short_ref
, src
->short_ref
, sizeof(dst
->short_ref
));
1651 memcpy(dst
->long_ref
, src
->long_ref
, sizeof(dst
->long_ref
));
1652 memcpy(dst
->default_ref_list
, src
->default_ref_list
, sizeof(dst
->default_ref_list
));
1653 memcpy(dst
->ref_list
, src
->ref_list
, sizeof(dst
->ref_list
));
1655 memcpy(dst
->dequant4_coeff
, src
->dequant4_coeff
, sizeof(src
->dequant4_coeff
));
1656 memcpy(dst
->dequant8_coeff
, src
->dequant8_coeff
, sizeof(src
->dequant8_coeff
));
1660 * decodes a slice header.
1661 * This will also call MPV_common_init() and frame_start() as needed.
1663 * @param h h264context
1664 * @param h0 h264 master context (differs from 'h' when doing sliced based parallel decoding)
1666 * @return 0 if okay, <0 if an error occurred, 1 if decoding must not be multithreaded
1668 static int decode_slice_header(H264Context
*h
, H264Context
*h0
){
1669 MpegEncContext
* const s
= &h
->s
;
1670 MpegEncContext
* const s0
= &h0
->s
;
1671 unsigned int first_mb_in_slice
;
1672 unsigned int pps_id
;
1673 int num_ref_idx_active_override_flag
;
1674 unsigned int slice_type
, tmp
, i
, j
;
1675 int default_ref_list_done
= 0;
1676 int last_pic_structure
;
1678 s
->dropable
= h
->nal_ref_idc
== 0;
1680 if((s
->avctx
->flags2
& CODEC_FLAG2_FAST
) && !h
->nal_ref_idc
){
1681 s
->me
.qpel_put
= s
->dsp
.put_2tap_qpel_pixels_tab
;
1682 s
->me
.qpel_avg
= s
->dsp
.avg_2tap_qpel_pixels_tab
;
1684 s
->me
.qpel_put
= s
->dsp
.put_h264_qpel_pixels_tab
;
1685 s
->me
.qpel_avg
= s
->dsp
.avg_h264_qpel_pixels_tab
;
1688 first_mb_in_slice
= get_ue_golomb(&s
->gb
);
1690 if(first_mb_in_slice
== 0){ //FIXME better field boundary detection
1691 if(h0
->current_slice
&& FIELD_PICTURE
){
1695 h0
->current_slice
= 0;
1696 if (!s0
->first_field
)
1697 s
->current_picture_ptr
= NULL
;
1700 slice_type
= get_ue_golomb_31(&s
->gb
);
1702 av_log(h
->s
.avctx
, AV_LOG_ERROR
, "slice type too large (%d) at %d %d\n", h
->slice_type
, s
->mb_x
, s
->mb_y
);
1707 h
->slice_type_fixed
=1;
1709 h
->slice_type_fixed
=0;
1711 slice_type
= golomb_to_pict_type
[ slice_type
];
1712 if (slice_type
== FF_I_TYPE
1713 || (h0
->current_slice
!= 0 && slice_type
== h0
->last_slice_type
) ) {
1714 default_ref_list_done
= 1;
1716 h
->slice_type
= slice_type
;
1717 h
->slice_type_nos
= slice_type
& 3;
1719 s
->pict_type
= h
->slice_type
; // to make a few old functions happy, it's wrong though
1720 if (s
->pict_type
== FF_B_TYPE
&& s0
->last_picture_ptr
== NULL
) {
1721 av_log(h
->s
.avctx
, AV_LOG_ERROR
,
1722 "B picture before any references, skipping\n");
1726 pps_id
= get_ue_golomb(&s
->gb
);
1727 if(pps_id
>=MAX_PPS_COUNT
){
1728 av_log(h
->s
.avctx
, AV_LOG_ERROR
, "pps_id out of range\n");
1731 if(!h0
->pps_buffers
[pps_id
]) {
1732 av_log(h
->s
.avctx
, AV_LOG_ERROR
, "non-existing PPS %u referenced\n", pps_id
);
1735 h
->pps
= *h0
->pps_buffers
[pps_id
];
1737 if(!h0
->sps_buffers
[h
->pps
.sps_id
]) {
1738 av_log(h
->s
.avctx
, AV_LOG_ERROR
, "non-existing SPS %u referenced\n", h
->pps
.sps_id
);
1741 h
->sps
= *h0
->sps_buffers
[h
->pps
.sps_id
];
1743 if(h
== h0
&& h
->dequant_coeff_pps
!= pps_id
){
1744 h
->dequant_coeff_pps
= pps_id
;
1745 init_dequant_tables(h
);
1748 s
->mb_width
= h
->sps
.mb_width
;
1749 s
->mb_height
= h
->sps
.mb_height
* (2 - h
->sps
.frame_mbs_only_flag
);
1751 h
->b_stride
= s
->mb_width
*4;
1752 h
->b8_stride
= s
->mb_width
*2;
1754 s
->width
= 16*s
->mb_width
- 2*FFMIN(h
->sps
.crop_right
, 7);
1755 if(h
->sps
.frame_mbs_only_flag
)
1756 s
->height
= 16*s
->mb_height
- 2*FFMIN(h
->sps
.crop_bottom
, 7);
1758 s
->height
= 16*s
->mb_height
- 4*FFMIN(h
->sps
.crop_bottom
, 3);
1760 if (s
->context_initialized
1761 && ( s
->width
!= s
->avctx
->width
|| s
->height
!= s
->avctx
->height
)) {
1763 return -1; // width / height changed during parallelized decoding
1765 flush_dpb(s
->avctx
);
1768 if (!s
->context_initialized
) {
1770 return -1; // we cant (re-)initialize context during parallel decoding
1772 avcodec_set_dimensions(s
->avctx
, s
->width
, s
->height
);
1773 s
->avctx
->sample_aspect_ratio
= h
->sps
.sar
;
1774 if(!s
->avctx
->sample_aspect_ratio
.den
)
1775 s
->avctx
->sample_aspect_ratio
.den
= 1;
1777 if(h
->sps
.video_signal_type_present_flag
){
1778 s
->avctx
->color_range
= h
->sps
.full_range ? AVCOL_RANGE_JPEG
: AVCOL_RANGE_MPEG
;
1779 if(h
->sps
.colour_description_present_flag
){
1780 s
->avctx
->color_primaries
= h
->sps
.color_primaries
;
1781 s
->avctx
->color_trc
= h
->sps
.color_trc
;
1782 s
->avctx
->colorspace
= h
->sps
.colorspace
;
1786 if(h
->sps
.timing_info_present_flag
){
1787 s
->avctx
->time_base
= (AVRational
){h
->sps
.num_units_in_tick
, h
->sps
.time_scale
};
1788 if(h
->x264_build
> 0 && h
->x264_build
< 44)
1789 s
->avctx
->time_base
.den
*= 2;
1790 av_reduce(&s
->avctx
->time_base
.num
, &s
->avctx
->time_base
.den
,
1791 s
->avctx
->time_base
.num
, s
->avctx
->time_base
.den
, 1<<30);
1793 s
->avctx
->pix_fmt
= s
->avctx
->get_format(s
->avctx
, s
->avctx
->codec
->pix_fmts
);
1794 s
->avctx
->hwaccel
= ff_find_hwaccel(s
->avctx
->codec
->id
, s
->avctx
->pix_fmt
);
1796 if (MPV_common_init(s
) < 0)
1799 h
->prev_interlaced_frame
= 1;
1801 init_scan_tables(h
);
1802 ff_h264_alloc_tables(h
);
1804 for(i
= 1; i
< s
->avctx
->thread_count
; i
++) {
1806 c
= h
->thread_context
[i
] = av_malloc(sizeof(H264Context
));
1807 memcpy(c
, h
->s
.thread_context
[i
], sizeof(MpegEncContext
));
1808 memset(&c
->s
+ 1, 0, sizeof(H264Context
) - sizeof(MpegEncContext
));
1811 init_scan_tables(c
);
1815 for(i
= 0; i
< s
->avctx
->thread_count
; i
++)
1816 if(context_init(h
->thread_context
[i
]) < 0)
1820 h
->frame_num
= get_bits(&s
->gb
, h
->sps
.log2_max_frame_num
);
1823 h
->mb_aff_frame
= 0;
1824 last_pic_structure
= s0
->picture_structure
;
1825 if(h
->sps
.frame_mbs_only_flag
){
1826 s
->picture_structure
= PICT_FRAME
;
1828 if(get_bits1(&s
->gb
)) { //field_pic_flag
1829 s
->picture_structure
= PICT_TOP_FIELD
+ get_bits1(&s
->gb
); //bottom_field_flag
1831 s
->picture_structure
= PICT_FRAME
;
1832 h
->mb_aff_frame
= h
->sps
.mb_aff
;
1835 h
->mb_field_decoding_flag
= s
->picture_structure
!= PICT_FRAME
;
1837 if(h0
->current_slice
== 0){
1838 while(h
->frame_num
!= h
->prev_frame_num
&&
1839 h
->frame_num
!= (h
->prev_frame_num
+1)%(1<<h
->sps
.log2_max_frame_num
)){
1840 av_log(NULL
, AV_LOG_DEBUG
, "Frame num gap %d %d\n", h
->frame_num
, h
->prev_frame_num
);
1841 if (ff_h264_frame_start(h
) < 0)
1843 h
->prev_frame_num
++;
1844 h
->prev_frame_num
%= 1<<h
->sps
.log2_max_frame_num
;
1845 s
->current_picture_ptr
->frame_num
= h
->prev_frame_num
;
1846 ff_h264_execute_ref_pic_marking(h
, NULL
, 0);
1849 /* See if we have a decoded first field looking for a pair... */
1850 if (s0
->first_field
) {
1851 assert(s0
->current_picture_ptr
);
1852 assert(s0
->current_picture_ptr
->data
[0]);
1853 assert(s0
->current_picture_ptr
->reference
!= DELAYED_PIC_REF
);
1855 /* figure out if we have a complementary field pair */
1856 if (!FIELD_PICTURE
|| s
->picture_structure
== last_pic_structure
) {
1858 * Previous field is unmatched. Don't display it, but let it
1859 * remain for reference if marked as such.
1861 s0
->current_picture_ptr
= NULL
;
1862 s0
->first_field
= FIELD_PICTURE
;
1865 if (h
->nal_ref_idc
&&
1866 s0
->current_picture_ptr
->reference
&&
1867 s0
->current_picture_ptr
->frame_num
!= h
->frame_num
) {
1869 * This and previous field were reference, but had
1870 * different frame_nums. Consider this field first in
1871 * pair. Throw away previous field except for reference
1874 s0
->first_field
= 1;
1875 s0
->current_picture_ptr
= NULL
;
1878 /* Second field in complementary pair */
1879 s0
->first_field
= 0;
1884 /* Frame or first field in a potentially complementary pair */
1885 assert(!s0
->current_picture_ptr
);
1886 s0
->first_field
= FIELD_PICTURE
;
1889 if((!FIELD_PICTURE
|| s0
->first_field
) && ff_h264_frame_start(h
) < 0) {
1890 s0
->first_field
= 0;
1897 s
->current_picture_ptr
->frame_num
= h
->frame_num
; //FIXME frame_num cleanup
1899 assert(s
->mb_num
== s
->mb_width
* s
->mb_height
);
1900 if(first_mb_in_slice
<< FIELD_OR_MBAFF_PICTURE
>= s
->mb_num
||
1901 first_mb_in_slice
>= s
->mb_num
){
1902 av_log(h
->s
.avctx
, AV_LOG_ERROR
, "first_mb_in_slice overflow\n");
1905 s
->resync_mb_x
= s
->mb_x
= first_mb_in_slice
% s
->mb_width
;
1906 s
->resync_mb_y
= s
->mb_y
= (first_mb_in_slice
/ s
->mb_width
) << FIELD_OR_MBAFF_PICTURE
;
1907 if (s
->picture_structure
== PICT_BOTTOM_FIELD
)
1908 s
->resync_mb_y
= s
->mb_y
= s
->mb_y
+ 1;
1909 assert(s
->mb_y
< s
->mb_height
);
1911 if(s
->picture_structure
==PICT_FRAME
){
1912 h
->curr_pic_num
= h
->frame_num
;
1913 h
->max_pic_num
= 1<< h
->sps
.log2_max_frame_num
;
1915 h
->curr_pic_num
= 2*h
->frame_num
+ 1;
1916 h
->max_pic_num
= 1<<(h
->sps
.log2_max_frame_num
+ 1);
1919 if(h
->nal_unit_type
== NAL_IDR_SLICE
){
1920 get_ue_golomb(&s
->gb
); /* idr_pic_id */
1923 if(h
->sps
.poc_type
==0){
1924 h
->poc_lsb
= get_bits(&s
->gb
, h
->sps
.log2_max_poc_lsb
);
1926 if(h
->pps
.pic_order_present
==1 && s
->picture_structure
==PICT_FRAME
){
1927 h
->delta_poc_bottom
= get_se_golomb(&s
->gb
);
1931 if(h
->sps
.poc_type
==1 && !h
->sps
.delta_pic_order_always_zero_flag
){
1932 h
->delta_poc
[0]= get_se_golomb(&s
->gb
);
1934 if(h
->pps
.pic_order_present
==1 && s
->picture_structure
==PICT_FRAME
)
1935 h
->delta_poc
[1]= get_se_golomb(&s
->gb
);
1940 if(h
->pps
.redundant_pic_cnt_present
){
1941 h
->redundant_pic_count
= get_ue_golomb(&s
->gb
);
1944 //set defaults, might be overridden a few lines later
1945 h
->ref_count
[0]= h
->pps
.ref_count
[0];
1946 h
->ref_count
[1]= h
->pps
.ref_count
[1];
1948 if(h
->slice_type_nos
!= FF_I_TYPE
){
1949 if(h
->slice_type_nos
== FF_B_TYPE
){
1950 h
->direct_spatial_mv_pred
= get_bits1(&s
->gb
);
1952 num_ref_idx_active_override_flag
= get_bits1(&s
->gb
);
1954 if(num_ref_idx_active_override_flag
){
1955 h
->ref_count
[0]= get_ue_golomb(&s
->gb
) + 1;
1956 if(h
->slice_type_nos
==FF_B_TYPE
)
1957 h
->ref_count
[1]= get_ue_golomb(&s
->gb
) + 1;
1959 if(h
->ref_count
[0]-1 > 32-1 || h
->ref_count
[1]-1 > 32-1){
1960 av_log(h
->s
.avctx
, AV_LOG_ERROR
, "reference overflow\n");
1961 h
->ref_count
[0]= h
->ref_count
[1]= 1;
1965 if(h
->slice_type_nos
== FF_B_TYPE
)
1972 if(!default_ref_list_done
){
1973 ff_h264_fill_default_ref_list(h
);
1976 if(h
->slice_type_nos
!=FF_I_TYPE
&& ff_h264_decode_ref_pic_list_reordering(h
) < 0)
1979 if(h
->slice_type_nos
!=FF_I_TYPE
){
1980 s
->last_picture_ptr
= &h
->ref_list
[0][0];
1981 ff_copy_picture(&s
->last_picture
, s
->last_picture_ptr
);
1983 if(h
->slice_type_nos
==FF_B_TYPE
){
1984 s
->next_picture_ptr
= &h
->ref_list
[1][0];
1985 ff_copy_picture(&s
->next_picture
, s
->next_picture_ptr
);
1988 if( (h
->pps
.weighted_pred
&& h
->slice_type_nos
== FF_P_TYPE
)
1989 || (h
->pps
.weighted_bipred_idc
==1 && h
->slice_type_nos
== FF_B_TYPE
) )
1990 pred_weight_table(h
);
1991 else if(h
->pps
.weighted_bipred_idc
==2 && h
->slice_type_nos
== FF_B_TYPE
)
1992 implicit_weight_table(h
);
1995 for (i
= 0; i
< 2; i
++) {
1996 h
->luma_weight_flag
[i
] = 0;
1997 h
->chroma_weight_flag
[i
] = 0;
2002 ff_h264_decode_ref_pic_marking(h0
, &s
->gb
);
2005 ff_h264_fill_mbaff_ref_list(h
);
2007 if(h
->slice_type_nos
==FF_B_TYPE
&& !h
->direct_spatial_mv_pred
)
2008 ff_h264_direct_dist_scale_factor(h
);
2009 ff_h264_direct_ref_list_init(h
);
2011 if( h
->slice_type_nos
!= FF_I_TYPE
&& h
->pps
.cabac
){
2012 tmp
= get_ue_golomb_31(&s
->gb
);
2014 av_log(s
->avctx
, AV_LOG_ERROR
, "cabac_init_idc overflow\n");
2017 h
->cabac_init_idc
= tmp
;
2020 h
->last_qscale_diff
= 0;
2021 tmp
= h
->pps
.init_qp
+ get_se_golomb(&s
->gb
);
2023 av_log(s
->avctx
, AV_LOG_ERROR
, "QP %u out of range\n", tmp
);
2027 h
->chroma_qp
[0] = get_chroma_qp(h
, 0, s
->qscale
);
2028 h
->chroma_qp
[1] = get_chroma_qp(h
, 1, s
->qscale
);
2029 //FIXME qscale / qp ... stuff
2030 if(h
->slice_type
== FF_SP_TYPE
){
2031 get_bits1(&s
->gb
); /* sp_for_switch_flag */
2033 if(h
->slice_type
==FF_SP_TYPE
|| h
->slice_type
== FF_SI_TYPE
){
2034 get_se_golomb(&s
->gb
); /* slice_qs_delta */
2037 h
->deblocking_filter
= 1;
2038 h
->slice_alpha_c0_offset
= 52;
2039 h
->slice_beta_offset
= 52;
2040 if( h
->pps
.deblocking_filter_parameters_present
) {
2041 tmp
= get_ue_golomb_31(&s
->gb
);
2043 av_log(s
->avctx
, AV_LOG_ERROR
, "deblocking_filter_idc %u out of range\n", tmp
);
2046 h
->deblocking_filter
= tmp
;
2047 if(h
->deblocking_filter
< 2)
2048 h
->deblocking_filter
^= 1; // 1<->0
2050 if( h
->deblocking_filter
) {
2051 h
->slice_alpha_c0_offset
+= get_se_golomb(&s
->gb
) << 1;
2052 h
->slice_beta_offset
+= get_se_golomb(&s
->gb
) << 1;
2053 if( h
->slice_alpha_c0_offset
> 104U
2054 || h
->slice_beta_offset
> 104U){
2055 av_log(s
->avctx
, AV_LOG_ERROR
, "deblocking filter parameters %d %d out of range\n", h
->slice_alpha_c0_offset
, h
->slice_beta_offset
);
2061 if( s
->avctx
->skip_loop_filter
>= AVDISCARD_ALL
2062 ||(s
->avctx
->skip_loop_filter
>= AVDISCARD_NONKEY
&& h
->slice_type_nos
!= FF_I_TYPE
)
2063 ||(s
->avctx
->skip_loop_filter
>= AVDISCARD_BIDIR
&& h
->slice_type_nos
== FF_B_TYPE
)
2064 ||(s
->avctx
->skip_loop_filter
>= AVDISCARD_NONREF
&& h
->nal_ref_idc
== 0))
2065 h
->deblocking_filter
= 0;
2067 if(h
->deblocking_filter
== 1 && h0
->max_contexts
> 1) {
2068 if(s
->avctx
->flags2
& CODEC_FLAG2_FAST
) {
2069 /* Cheat slightly for speed:
2070 Do not bother to deblock across slices. */
2071 h
->deblocking_filter
= 2;
2073 h0
->max_contexts
= 1;
2074 if(!h0
->single_decode_warning
) {
2075 av_log(s
->avctx
, AV_LOG_INFO
, "Cannot parallelize deblocking type 1, decoding such frames in sequential order\n");
2076 h0
->single_decode_warning
= 1;
2079 return 1; // deblocking switched inside frame
2082 h
->qp_thresh
= 15 + 52 - FFMIN(h
->slice_alpha_c0_offset
, h
->slice_beta_offset
) - FFMAX3(0, h
->pps
.chroma_qp_index_offset
[0], h
->pps
.chroma_qp_index_offset
[1]);
2085 if( h
->pps
.num_slice_groups
> 1 && h
->pps
.mb_slice_group_map_type
>= 3 && h
->pps
.mb_slice_group_map_type
<= 5)
2086 slice_group_change_cycle
= get_bits(&s
->gb
, ?
);
2089 h0
->last_slice_type
= slice_type
;
2090 h
->slice_num
= ++h0
->current_slice
;
2091 if(h
->slice_num
>= MAX_SLICES
){
2092 av_log(s
->avctx
, AV_LOG_ERROR
, "Too many slices, increase MAX_SLICES and recompile\n");
2097 int *ref2frm
= h
->ref2frm
[h
->slice_num
&(MAX_SLICES
-1)][j
];
2098 for(i
=0; i
<16; i
++){
2100 if(h
->ref_list
[j
][i
].data
[0]){
2102 uint8_t *base
= h
->ref_list
[j
][i
].base
[0];
2103 for(k
=0; k
<h
->short_ref_count
; k
++)
2104 if(h
->short_ref
[k
]->base
[0] == base
){
2108 for(k
=0; k
<h
->long_ref_count
; k
++)
2109 if(h
->long_ref
[k
] && h
->long_ref
[k
]->base
[0] == base
){
2110 id_list
[i
]= h
->short_ref_count
+ k
;
2119 ref2frm
[i
+2]= 4*id_list
[i
]
2120 +(h
->ref_list
[j
][i
].reference
&3);
2123 for(i
=16; i
<48; i
++)
2124 ref2frm
[i
+4]= 4*id_list
[(i
-16)>>1]
2125 +(h
->ref_list
[j
][i
].reference
&3);
2128 h
->emu_edge_width
= (s
->flags
&CODEC_FLAG_EMU_EDGE
) ?
0 : 16;
2129 h
->emu_edge_height
= (FRAME_MBAFF
|| FIELD_PICTURE
) ?
0 : h
->emu_edge_width
;
2131 s
->avctx
->refs
= h
->sps
.ref_frame_count
;
2133 if(s
->avctx
->debug
&FF_DEBUG_PICT_INFO
){
2134 av_log(h
->s
.avctx
, AV_LOG_DEBUG
, "slice:%d %s mb:%d %c%s%s pps:%u frame:%d poc:%d/%d ref:%d/%d qp:%d loop:%d:%d:%d weight:%d%s %s\n",
2136 (s
->picture_structure
==PICT_FRAME ?
"F" : s
->picture_structure
==PICT_TOP_FIELD ?
"T" : "B"),
2138 av_get_pict_type_char(h
->slice_type
), h
->slice_type_fixed ?
" fix" : "", h
->nal_unit_type
== NAL_IDR_SLICE ?
" IDR" : "",
2139 pps_id
, h
->frame_num
,
2140 s
->current_picture_ptr
->field_poc
[0], s
->current_picture_ptr
->field_poc
[1],
2141 h
->ref_count
[0], h
->ref_count
[1],
2143 h
->deblocking_filter
, h
->slice_alpha_c0_offset
/2-26, h
->slice_beta_offset
/2-26,
2145 h
->use_weight
==1 && h
->use_weight_chroma ?
"c" : "",
2146 h
->slice_type
== FF_B_TYPE ?
(h
->direct_spatial_mv_pred ?
"SPAT" : "TEMP") : ""
2153 int ff_h264_get_slice_type(const H264Context
*h
)
2155 switch (h
->slice_type
) {
2156 case FF_P_TYPE
: return 0;
2157 case FF_B_TYPE
: return 1;
2158 case FF_I_TYPE
: return 2;
2159 case FF_SP_TYPE
: return 3;
2160 case FF_SI_TYPE
: return 4;
2165 static void loop_filter(H264Context
*h
){
2166 MpegEncContext
* const s
= &h
->s
;
2167 uint8_t *dest_y
, *dest_cb
, *dest_cr
;
2168 int linesize
, uvlinesize
, mb_x
, mb_y
;
2169 const int end_mb_y
= s
->mb_y
+ FRAME_MBAFF
;
2170 const int old_slice_type
= h
->slice_type
;
2172 if(h
->deblocking_filter
) {
2173 for(mb_x
= 0; mb_x
<s
->mb_width
; mb_x
++){
2174 for(mb_y
=end_mb_y
- FRAME_MBAFF
; mb_y
<= end_mb_y
; mb_y
++){
2175 int list
, mb_xy
, mb_type
;
2176 mb_xy
= h
->mb_xy
= mb_x
+ mb_y
*s
->mb_stride
;
2177 h
->slice_num
= h
->slice_table
[mb_xy
];
2178 mb_type
= s
->current_picture
.mb_type
[mb_xy
];
2179 h
->list_count
= h
->list_counts
[mb_xy
];
2182 h
->mb_mbaff
= h
->mb_field_decoding_flag
= !!IS_INTERLACED(mb_type
);
2186 dest_y
= s
->current_picture
.data
[0] + (mb_x
+ mb_y
* s
->linesize
) * 16;
2187 dest_cb
= s
->current_picture
.data
[1] + (mb_x
+ mb_y
* s
->uvlinesize
) * 8;
2188 dest_cr
= s
->current_picture
.data
[2] + (mb_x
+ mb_y
* s
->uvlinesize
) * 8;
2189 //FIXME simplify above
2192 linesize
= h
->mb_linesize
= s
->linesize
* 2;
2193 uvlinesize
= h
->mb_uvlinesize
= s
->uvlinesize
* 2;
2194 if(mb_y
&1){ //FIXME move out of this function?
2195 dest_y
-= s
->linesize
*15;
2196 dest_cb
-= s
->uvlinesize
*7;
2197 dest_cr
-= s
->uvlinesize
*7;
2200 linesize
= h
->mb_linesize
= s
->linesize
;
2201 uvlinesize
= h
->mb_uvlinesize
= s
->uvlinesize
;
2203 backup_mb_border(h
, dest_y
, dest_cb
, dest_cr
, linesize
, uvlinesize
, 0);
2204 if(fill_filter_caches(h
, mb_type
))
2206 h
->chroma_qp
[0] = get_chroma_qp(h
, 0, s
->current_picture
.qscale_table
[mb_xy
]);
2207 h
->chroma_qp
[1] = get_chroma_qp(h
, 1, s
->current_picture
.qscale_table
[mb_xy
]);
2210 ff_h264_filter_mb (h
, mb_x
, mb_y
, dest_y
, dest_cb
, dest_cr
, linesize
, uvlinesize
);
2212 ff_h264_filter_mb_fast(h
, mb_x
, mb_y
, dest_y
, dest_cb
, dest_cr
, linesize
, uvlinesize
);
2217 h
->slice_type
= old_slice_type
;
2219 s
->mb_y
= end_mb_y
- FRAME_MBAFF
;
2222 static int decode_slice(struct AVCodecContext
*avctx
, void *arg
){
2223 H264Context
*h
= *(void**)arg
;
2224 MpegEncContext
* const s
= &h
->s
;
2225 const int part_mask
= s
->partitioned_frame ?
(AC_END
|AC_ERROR
) : 0x7F;
2229 h
->is_complex
= FRAME_MBAFF
|| s
->picture_structure
!= PICT_FRAME
|| s
->codec_id
!= CODEC_ID_H264
||
2230 (CONFIG_GRAY
&& (s
->flags
&CODEC_FLAG_GRAY
));
2232 if( h
->pps
.cabac
) {
2234 align_get_bits( &s
->gb
);
2237 ff_init_cabac_states( &h
->cabac
);
2238 ff_init_cabac_decoder( &h
->cabac
,
2239 s
->gb
.buffer
+ get_bits_count(&s
->gb
)/8,
2240 (get_bits_left(&s
->gb
) + 7)/8);
2242 ff_h264_init_cabac_states(h
);
2246 int ret
= ff_h264_decode_mb_cabac(h
);
2248 //STOP_TIMER("decode_mb_cabac")
2250 if(ret
>=0) ff_h264_hl_decode_mb(h
);
2252 if( ret
>= 0 && FRAME_MBAFF
) { //FIXME optimal? or let mb_decode decode 16x32 ?
2255 ret
= ff_h264_decode_mb_cabac(h
);
2257 if(ret
>=0) ff_h264_hl_decode_mb(h
);
2260 eos
= get_cabac_terminate( &h
->cabac
);
2262 if( ret
< 0 || h
->cabac
.bytestream
> h
->cabac
.bytestream_end
+ 2) {
2263 av_log(h
->s
.avctx
, AV_LOG_ERROR
, "error while decoding MB %d %d, bytestream (%td)\n", s
->mb_x
, s
->mb_y
, h
->cabac
.bytestream_end
- h
->cabac
.bytestream
);
2264 ff_er_add_slice(s
, s
->resync_mb_x
, s
->resync_mb_y
, s
->mb_x
, s
->mb_y
, (AC_ERROR
|DC_ERROR
|MV_ERROR
)&part_mask
);
2268 if( ++s
->mb_x
>= s
->mb_width
) {
2271 ff_draw_horiz_band(s
, 16*s
->mb_y
, 16);
2273 if(FIELD_OR_MBAFF_PICTURE
) {
2278 if( eos
|| s
->mb_y
>= s
->mb_height
) {
2279 tprintf(s
->avctx
, "slice end %d %d\n", get_bits_count(&s
->gb
), s
->gb
.size_in_bits
);
2280 ff_er_add_slice(s
, s
->resync_mb_x
, s
->resync_mb_y
, s
->mb_x
-1, s
->mb_y
, (AC_END
|DC_END
|MV_END
)&part_mask
);
2287 int ret
= ff_h264_decode_mb_cavlc(h
);
2289 if(ret
>=0) ff_h264_hl_decode_mb(h
);
2291 if(ret
>=0 && FRAME_MBAFF
){ //FIXME optimal? or let mb_decode decode 16x32 ?
2293 ret
= ff_h264_decode_mb_cavlc(h
);
2295 if(ret
>=0) ff_h264_hl_decode_mb(h
);
2300 av_log(h
->s
.avctx
, AV_LOG_ERROR
, "error while decoding MB %d %d\n", s
->mb_x
, s
->mb_y
);
2301 ff_er_add_slice(s
, s
->resync_mb_x
, s
->resync_mb_y
, s
->mb_x
, s
->mb_y
, (AC_ERROR
|DC_ERROR
|MV_ERROR
)&part_mask
);
2306 if(++s
->mb_x
>= s
->mb_width
){
2309 ff_draw_horiz_band(s
, 16*s
->mb_y
, 16);
2311 if(FIELD_OR_MBAFF_PICTURE
) {
2314 if(s
->mb_y
>= s
->mb_height
){
2315 tprintf(s
->avctx
, "slice end %d %d\n", get_bits_count(&s
->gb
), s
->gb
.size_in_bits
);
2317 if(get_bits_count(&s
->gb
) == s
->gb
.size_in_bits
) {
2318 ff_er_add_slice(s
, s
->resync_mb_x
, s
->resync_mb_y
, s
->mb_x
-1, s
->mb_y
, (AC_END
|DC_END
|MV_END
)&part_mask
);
2322 ff_er_add_slice(s
, s
->resync_mb_x
, s
->resync_mb_y
, s
->mb_x
, s
->mb_y
, (AC_END
|DC_END
|MV_END
)&part_mask
);
2329 if(get_bits_count(&s
->gb
) >= s
->gb
.size_in_bits
&& s
->mb_skip_run
<=0){
2330 tprintf(s
->avctx
, "slice end %d %d\n", get_bits_count(&s
->gb
), s
->gb
.size_in_bits
);
2331 if(get_bits_count(&s
->gb
) == s
->gb
.size_in_bits
){
2332 ff_er_add_slice(s
, s
->resync_mb_x
, s
->resync_mb_y
, s
->mb_x
-1, s
->mb_y
, (AC_END
|DC_END
|MV_END
)&part_mask
);
2336 ff_er_add_slice(s
, s
->resync_mb_x
, s
->resync_mb_y
, s
->mb_x
, s
->mb_y
, (AC_ERROR
|DC_ERROR
|MV_ERROR
)&part_mask
);
2345 for(;s
->mb_y
< s
->mb_height
; s
->mb_y
++){
2346 for(;s
->mb_x
< s
->mb_width
; s
->mb_x
++){
2347 int ret
= decode_mb(h
);
2349 ff_h264_hl_decode_mb(h
);
2352 av_log(s
->avctx
, AV_LOG_ERROR
, "error while decoding MB %d %d\n", s
->mb_x
, s
->mb_y
);
2353 ff_er_add_slice(s
, s
->resync_mb_x
, s
->resync_mb_y
, s
->mb_x
, s
->mb_y
, (AC_ERROR
|DC_ERROR
|MV_ERROR
)&part_mask
);
2358 if(++s
->mb_x
>= s
->mb_width
){
2360 if(++s
->mb_y
>= s
->mb_height
){
2361 if(get_bits_count(s
->gb
) == s
->gb
.size_in_bits
){
2362 ff_er_add_slice(s
, s
->resync_mb_x
, s
->resync_mb_y
, s
->mb_x
-1, s
->mb_y
, (AC_END
|DC_END
|MV_END
)&part_mask
);
2366 ff_er_add_slice(s
, s
->resync_mb_x
, s
->resync_mb_y
, s
->mb_x
, s
->mb_y
, (AC_END
|DC_END
|MV_END
)&part_mask
);
2373 if(get_bits_count(s
->?gb
) >= s
->gb?
.size_in_bits
){
2374 if(get_bits_count(s
->gb
) == s
->gb
.size_in_bits
){
2375 ff_er_add_slice(s
, s
->resync_mb_x
, s
->resync_mb_y
, s
->mb_x
-1, s
->mb_y
, (AC_END
|DC_END
|MV_END
)&part_mask
);
2379 ff_er_add_slice(s
, s
->resync_mb_x
, s
->resync_mb_y
, s
->mb_x
, s
->mb_y
, (AC_ERROR
|DC_ERROR
|MV_ERROR
)&part_mask
);
2386 ff_draw_horiz_band(s
, 16*s
->mb_y
, 16);
2389 return -1; //not reached
2393 * Call decode_slice() for each context.
2395 * @param h h264 master context
2396 * @param context_count number of contexts to execute
2398 static void execute_decode_slices(H264Context
*h
, int context_count
){
2399 MpegEncContext
* const s
= &h
->s
;
2400 AVCodecContext
* const avctx
= s
->avctx
;
2404 if (s
->avctx
->hwaccel
)
2406 if(s
->avctx
->codec
->capabilities
&CODEC_CAP_HWACCEL_VDPAU
)
2408 if(context_count
== 1) {
2409 decode_slice(avctx
, &h
);
2411 for(i
= 1; i
< context_count
; i
++) {
2412 hx
= h
->thread_context
[i
];
2413 hx
->s
.error_recognition
= avctx
->error_recognition
;
2414 hx
->s
.error_count
= 0;
2417 avctx
->execute(avctx
, (void *)decode_slice
,
2418 h
->thread_context
, NULL
, context_count
, sizeof(void*));
2420 /* pull back stuff from slices to master context */
2421 hx
= h
->thread_context
[context_count
- 1];
2422 s
->mb_x
= hx
->s
.mb_x
;
2423 s
->mb_y
= hx
->s
.mb_y
;
2424 s
->dropable
= hx
->s
.dropable
;
2425 s
->picture_structure
= hx
->s
.picture_structure
;
2426 for(i
= 1; i
< context_count
; i
++)
2427 h
->s
.error_count
+= h
->thread_context
[i
]->s
.error_count
;
2432 static int decode_nal_units(H264Context
*h
, const uint8_t *buf
, int buf_size
){
2433 MpegEncContext
* const s
= &h
->s
;
2434 AVCodecContext
* const avctx
= s
->avctx
;
2436 H264Context
*hx
; ///< thread context
2437 int context_count
= 0;
2438 int next_avc
= h
->is_avc ?
0 : buf_size
;
2440 h
->max_contexts
= avctx
->thread_count
;
2443 for(i
=0; i
<50; i
++){
2444 av_log(NULL
, AV_LOG_ERROR
,"%02X ", buf
[i
]);
2447 if(!(s
->flags2
& CODEC_FLAG2_CHUNKS
)){
2448 h
->current_slice
= 0;
2449 if (!s
->first_field
)
2450 s
->current_picture_ptr
= NULL
;
2451 ff_h264_reset_sei(h
);
2462 if(buf_index
>= next_avc
) {
2463 if(buf_index
>= buf_size
) break;
2465 for(i
= 0; i
< h
->nal_length_size
; i
++)
2466 nalsize
= (nalsize
<< 8) | buf
[buf_index
++];
2467 if(nalsize
<= 1 || nalsize
> buf_size
- buf_index
){
2472 av_log(h
->s
.avctx
, AV_LOG_ERROR
, "AVC: nal size %d\n", nalsize
);
2476 next_avc
= buf_index
+ nalsize
;
2478 // start code prefix search
2479 for(; buf_index
+ 3 < next_avc
; buf_index
++){
2480 // This should always succeed in the first iteration.
2481 if(buf
[buf_index
] == 0 && buf
[buf_index
+1] == 0 && buf
[buf_index
+2] == 1)
2485 if(buf_index
+3 >= buf_size
) break;
2488 if(buf_index
>= next_avc
) continue;
2491 hx
= h
->thread_context
[context_count
];
2493 ptr
= ff_h264_decode_nal(hx
, buf
+ buf_index
, &dst_length
, &consumed
, next_avc
- buf_index
);
2494 if (ptr
==NULL
|| dst_length
< 0){
2497 while(ptr
[dst_length
- 1] == 0 && dst_length
> 0)
2499 bit_length
= !dst_length ?
0 : (8*dst_length
- ff_h264_decode_rbsp_trailing(h
, ptr
+ dst_length
- 1));
2501 if(s
->avctx
->debug
&FF_DEBUG_STARTCODE
){
2502 av_log(h
->s
.avctx
, AV_LOG_DEBUG
, "NAL %d at %d/%d length %d\n", hx
->nal_unit_type
, buf_index
, buf_size
, dst_length
);
2505 if (h
->is_avc
&& (nalsize
!= consumed
) && nalsize
){
2506 av_log(h
->s
.avctx
, AV_LOG_DEBUG
, "AVC: Consumed only %d bytes instead of %d\n", consumed
, nalsize
);
2509 buf_index
+= consumed
;
2511 if( (s
->hurry_up
== 1 && h
->nal_ref_idc
== 0) //FIXME do not discard SEI id
2512 ||(avctx
->skip_frame
>= AVDISCARD_NONREF
&& h
->nal_ref_idc
== 0))
2517 switch(hx
->nal_unit_type
){
2519 if (h
->nal_unit_type
!= NAL_IDR_SLICE
) {
2520 av_log(h
->s
.avctx
, AV_LOG_ERROR
, "Invalid mix of idr and non-idr slices");
2523 idr(h
); //FIXME ensure we don't loose some frames if there is reordering
2525 init_get_bits(&hx
->s
.gb
, ptr
, bit_length
);
2527 hx
->inter_gb_ptr
= &hx
->s
.gb
;
2528 hx
->s
.data_partitioning
= 0;
2530 if((err
= decode_slice_header(hx
, h
)))
2533 if (s
->avctx
->hwaccel
&& h
->current_slice
== 1) {
2534 if (s
->avctx
->hwaccel
->start_frame(s
->avctx
, NULL
, 0) < 0)
2538 s
->current_picture_ptr
->key_frame
|=
2539 (hx
->nal_unit_type
== NAL_IDR_SLICE
) ||
2540 (h
->sei_recovery_frame_cnt
>= 0);
2541 if(hx
->redundant_pic_count
==0 && hx
->s
.hurry_up
< 5
2542 && (avctx
->skip_frame
< AVDISCARD_NONREF
|| hx
->nal_ref_idc
)
2543 && (avctx
->skip_frame
< AVDISCARD_BIDIR
|| hx
->slice_type_nos
!=FF_B_TYPE
)
2544 && (avctx
->skip_frame
< AVDISCARD_NONKEY
|| hx
->slice_type_nos
==FF_I_TYPE
)
2545 && avctx
->skip_frame
< AVDISCARD_ALL
){
2546 if(avctx
->hwaccel
) {
2547 if (avctx
->hwaccel
->decode_slice(avctx
, &buf
[buf_index
- consumed
], consumed
) < 0)
2550 if(CONFIG_H264_VDPAU_DECODER
&& s
->avctx
->codec
->capabilities
&CODEC_CAP_HWACCEL_VDPAU
){
2551 static const uint8_t start_code
[] = {0x00, 0x00, 0x01};
2552 ff_vdpau_add_data_chunk(s
, start_code
, sizeof(start_code
));
2553 ff_vdpau_add_data_chunk(s
, &buf
[buf_index
- consumed
], consumed
);
2559 init_get_bits(&hx
->s
.gb
, ptr
, bit_length
);
2561 hx
->inter_gb_ptr
= NULL
;
2563 if ((err
= decode_slice_header(hx
, h
)) < 0)
2566 hx
->s
.data_partitioning
= 1;
2570 init_get_bits(&hx
->intra_gb
, ptr
, bit_length
);
2571 hx
->intra_gb_ptr
= &hx
->intra_gb
;
2574 init_get_bits(&hx
->inter_gb
, ptr
, bit_length
);
2575 hx
->inter_gb_ptr
= &hx
->inter_gb
;
2577 if(hx
->redundant_pic_count
==0 && hx
->intra_gb_ptr
&& hx
->s
.data_partitioning
2578 && s
->context_initialized
2580 && (avctx
->skip_frame
< AVDISCARD_NONREF
|| hx
->nal_ref_idc
)
2581 && (avctx
->skip_frame
< AVDISCARD_BIDIR
|| hx
->slice_type_nos
!=FF_B_TYPE
)
2582 && (avctx
->skip_frame
< AVDISCARD_NONKEY
|| hx
->slice_type_nos
==FF_I_TYPE
)
2583 && avctx
->skip_frame
< AVDISCARD_ALL
)
2587 init_get_bits(&s
->gb
, ptr
, bit_length
);
2588 ff_h264_decode_sei(h
);
2591 init_get_bits(&s
->gb
, ptr
, bit_length
);
2592 ff_h264_decode_seq_parameter_set(h
);
2594 if(s
->flags
& CODEC_FLAG_LOW_DELAY
)
2597 if(avctx
->has_b_frames
< 2)
2598 avctx
->has_b_frames
= !s
->low_delay
;
2601 init_get_bits(&s
->gb
, ptr
, bit_length
);
2603 ff_h264_decode_picture_parameter_set(h
, bit_length
);
2607 case NAL_END_SEQUENCE
:
2608 case NAL_END_STREAM
:
2609 case NAL_FILLER_DATA
:
2611 case NAL_AUXILIARY_SLICE
:
2614 av_log(avctx
, AV_LOG_DEBUG
, "Unknown NAL code: %d (%d bits)\n", hx
->nal_unit_type
, bit_length
);
2617 if(context_count
== h
->max_contexts
) {
2618 execute_decode_slices(h
, context_count
);
2623 av_log(h
->s
.avctx
, AV_LOG_ERROR
, "decode_slice_header error\n");
2625 /* Slice could not be decoded in parallel mode, copy down
2626 * NAL unit stuff to context 0 and restart. Note that
2627 * rbsp_buffer is not transferred, but since we no longer
2628 * run in parallel mode this should not be an issue. */
2629 h
->nal_unit_type
= hx
->nal_unit_type
;
2630 h
->nal_ref_idc
= hx
->nal_ref_idc
;
2636 execute_decode_slices(h
, context_count
);
2641 * returns the number of bytes consumed for building the current frame
2643 static int get_consumed_bytes(MpegEncContext
*s
, int pos
, int buf_size
){
2644 if(pos
==0) pos
=1; //avoid infinite loops (i doubt that is needed but ...)
2645 if(pos
+10>buf_size
) pos
=buf_size
; // oops ;)
2650 static int decode_frame(AVCodecContext
*avctx
,
2651 void *data
, int *data_size
,
2654 const uint8_t *buf
= avpkt
->data
;
2655 int buf_size
= avpkt
->size
;
2656 H264Context
*h
= avctx
->priv_data
;
2657 MpegEncContext
*s
= &h
->s
;
2658 AVFrame
*pict
= data
;
2661 s
->flags
= avctx
->flags
;
2662 s
->flags2
= avctx
->flags2
;
2664 /* end of stream, output what is still in the buffers */
2665 if (buf_size
== 0) {
2669 //FIXME factorize this with the output code below
2670 out
= h
->delayed_pic
[0];
2672 for(i
=1; h
->delayed_pic
[i
] && !h
->delayed_pic
[i
]->key_frame
&& !h
->delayed_pic
[i
]->mmco_reset
; i
++)
2673 if(h
->delayed_pic
[i
]->poc
< out
->poc
){
2674 out
= h
->delayed_pic
[i
];
2678 for(i
=out_idx
; h
->delayed_pic
[i
]; i
++)
2679 h
->delayed_pic
[i
] = h
->delayed_pic
[i
+1];
2682 *data_size
= sizeof(AVFrame
);
2683 *pict
= *(AVFrame
*)out
;
2689 if(h
->is_avc
&& !h
->got_avcC
) {
2690 int i
, cnt
, nalsize
;
2691 unsigned char *p
= avctx
->extradata
;
2692 if(avctx
->extradata_size
< 7) {
2693 av_log(avctx
, AV_LOG_ERROR
, "avcC too short\n");
2697 av_log(avctx
, AV_LOG_ERROR
, "Unknown avcC version %d\n", *p
);
2700 /* sps and pps in the avcC always have length coded with 2 bytes,
2701 so put a fake nal_length_size = 2 while parsing them */
2702 h
->nal_length_size
= 2;
2703 // Decode sps from avcC
2704 cnt
= *(p
+5) & 0x1f; // Number of sps
2706 for (i
= 0; i
< cnt
; i
++) {
2707 nalsize
= AV_RB16(p
) + 2;
2708 if(decode_nal_units(h
, p
, nalsize
) < 0) {
2709 av_log(avctx
, AV_LOG_ERROR
, "Decoding sps %d from avcC failed\n", i
);
2714 // Decode pps from avcC
2715 cnt
= *(p
++); // Number of pps
2716 for (i
= 0; i
< cnt
; i
++) {
2717 nalsize
= AV_RB16(p
) + 2;
2718 if(decode_nal_units(h
, p
, nalsize
) != nalsize
) {
2719 av_log(avctx
, AV_LOG_ERROR
, "Decoding pps %d from avcC failed\n", i
);
2724 // Now store right nal length size, that will be use to parse all other nals
2725 h
->nal_length_size
= ((*(((char*)(avctx
->extradata
))+4))&0x03)+1;
2726 // Do not reparse avcC
2730 if(!h
->got_avcC
&& !h
->is_avc
&& s
->avctx
->extradata_size
){
2731 if(decode_nal_units(h
, s
->avctx
->extradata
, s
->avctx
->extradata_size
) < 0)
2736 buf_index
=decode_nal_units(h
, buf
, buf_size
);
2740 if(!(s
->flags2
& CODEC_FLAG2_CHUNKS
) && !s
->current_picture_ptr
){
2741 if (avctx
->skip_frame
>= AVDISCARD_NONREF
|| s
->hurry_up
) return 0;
2742 av_log(avctx
, AV_LOG_ERROR
, "no frame!\n");
2746 if(!(s
->flags2
& CODEC_FLAG2_CHUNKS
) || (s
->mb_y
>= s
->mb_height
&& s
->mb_height
)){
2747 Picture
*out
= s
->current_picture_ptr
;
2748 Picture
*cur
= s
->current_picture_ptr
;
2749 int i
, pics
, out_of_order
, out_idx
;
2753 if (cur
->field_poc
[0]==INT_MAX
|| cur
->field_poc
[1]==INT_MAX
) {
2754 /* Wait for second field. */
2758 cur
->interlaced_frame
= 0;
2759 cur
->repeat_pict
= 0;
2761 /* Signal interlacing information externally. */
2762 /* Prioritize picture timing SEI information over used decoding process if it exists. */
2764 if(h
->sps
.pic_struct_present_flag
){
2765 switch (h
->sei_pic_struct
)
2767 case SEI_PIC_STRUCT_FRAME
:
2769 case SEI_PIC_STRUCT_TOP_FIELD
:
2770 case SEI_PIC_STRUCT_BOTTOM_FIELD
:
2771 cur
->interlaced_frame
= 1;
2773 case SEI_PIC_STRUCT_TOP_BOTTOM
:
2774 case SEI_PIC_STRUCT_BOTTOM_TOP
:
2775 if (FIELD_OR_MBAFF_PICTURE
)
2776 cur
->interlaced_frame
= 1;
2778 // try to flag soft telecine progressive
2779 cur
->interlaced_frame
= h
->prev_interlaced_frame
;
2781 case SEI_PIC_STRUCT_TOP_BOTTOM_TOP
:
2782 case SEI_PIC_STRUCT_BOTTOM_TOP_BOTTOM
:
2783 // Signal the possibility of telecined film externally (pic_struct 5,6)
2784 // From these hints, let the applications decide if they apply deinterlacing.
2785 cur
->repeat_pict
= 1;
2787 case SEI_PIC_STRUCT_FRAME_DOUBLING
:
2788 // Force progressive here, as doubling interlaced frame is a bad idea.
2789 cur
->repeat_pict
= 2;
2791 case SEI_PIC_STRUCT_FRAME_TRIPLING
:
2792 cur
->repeat_pict
= 4;
2796 if ((h
->sei_ct_type
& 3) && h
->sei_pic_struct
<= SEI_PIC_STRUCT_BOTTOM_TOP
)
2797 cur
->interlaced_frame
= (h
->sei_ct_type
& (1<<1)) != 0;
2799 /* Derive interlacing flag from used decoding process. */
2800 cur
->interlaced_frame
= FIELD_OR_MBAFF_PICTURE
;
2802 h
->prev_interlaced_frame
= cur
->interlaced_frame
;
2804 if (cur
->field_poc
[0] != cur
->field_poc
[1]){
2805 /* Derive top_field_first from field pocs. */
2806 cur
->top_field_first
= cur
->field_poc
[0] < cur
->field_poc
[1];
2808 if(cur
->interlaced_frame
|| h
->sps
.pic_struct_present_flag
){
2809 /* Use picture timing SEI information. Even if it is a information of a past frame, better than nothing. */
2810 if(h
->sei_pic_struct
== SEI_PIC_STRUCT_TOP_BOTTOM
2811 || h
->sei_pic_struct
== SEI_PIC_STRUCT_TOP_BOTTOM_TOP
)
2812 cur
->top_field_first
= 1;
2814 cur
->top_field_first
= 0;
2816 /* Most likely progressive */
2817 cur
->top_field_first
= 0;
2821 //FIXME do something with unavailable reference frames
2823 /* Sort B-frames into display order */
2825 if(h
->sps
.bitstream_restriction_flag
2826 && s
->avctx
->has_b_frames
< h
->sps
.num_reorder_frames
){
2827 s
->avctx
->has_b_frames
= h
->sps
.num_reorder_frames
;
2831 if( s
->avctx
->strict_std_compliance
>= FF_COMPLIANCE_STRICT
2832 && !h
->sps
.bitstream_restriction_flag
){
2833 s
->avctx
->has_b_frames
= MAX_DELAYED_PIC_COUNT
;
2838 while(h
->delayed_pic
[pics
]) pics
++;
2840 assert(pics
<= MAX_DELAYED_PIC_COUNT
);
2842 h
->delayed_pic
[pics
++] = cur
;
2843 if(cur
->reference
== 0)
2844 cur
->reference
= DELAYED_PIC_REF
;
2846 out
= h
->delayed_pic
[0];
2848 for(i
=1; h
->delayed_pic
[i
] && !h
->delayed_pic
[i
]->key_frame
&& !h
->delayed_pic
[i
]->mmco_reset
; i
++)
2849 if(h
->delayed_pic
[i
]->poc
< out
->poc
){
2850 out
= h
->delayed_pic
[i
];
2853 if(s
->avctx
->has_b_frames
== 0 && (h
->delayed_pic
[0]->key_frame
|| h
->delayed_pic
[0]->mmco_reset
))
2854 h
->outputed_poc
= INT_MIN
;
2855 out_of_order
= out
->poc
< h
->outputed_poc
;
2857 if(h
->sps
.bitstream_restriction_flag
&& s
->avctx
->has_b_frames
>= h
->sps
.num_reorder_frames
)
2859 else if((out_of_order
&& pics
-1 == s
->avctx
->has_b_frames
&& s
->avctx
->has_b_frames
< MAX_DELAYED_PIC_COUNT
)
2861 ((h
->outputed_poc
!= INT_MIN
&& out
->poc
> h
->outputed_poc
+ 2)
2862 || cur
->pict_type
== FF_B_TYPE
)))
2865 s
->avctx
->has_b_frames
++;
2868 if(out_of_order
|| pics
> s
->avctx
->has_b_frames
){
2869 out
->reference
&= ~DELAYED_PIC_REF
;
2870 for(i
=out_idx
; h
->delayed_pic
[i
]; i
++)
2871 h
->delayed_pic
[i
] = h
->delayed_pic
[i
+1];
2873 if(!out_of_order
&& pics
> s
->avctx
->has_b_frames
){
2874 *data_size
= sizeof(AVFrame
);
2876 if(out_idx
==0 && h
->delayed_pic
[0] && (h
->delayed_pic
[0]->key_frame
|| h
->delayed_pic
[0]->mmco_reset
)) {
2877 h
->outputed_poc
= INT_MIN
;
2879 h
->outputed_poc
= out
->poc
;
2880 *pict
= *(AVFrame
*)out
;
2882 av_log(avctx
, AV_LOG_DEBUG
, "no picture\n");
2887 assert(pict
->data
[0] || !*data_size
);
2888 ff_print_debug_info(s
, pict
);
2889 //printf("out %d\n", (int)pict->data[0]);
2891 return get_consumed_bytes(s
, buf_index
, buf_size
);
2894 static inline void fill_mb_avail(H264Context
*h
){
2895 MpegEncContext
* const s
= &h
->s
;
2896 const int mb_xy
= s
->mb_x
+ s
->mb_y
*s
->mb_stride
;
2899 h
->mb_avail
[0]= s
->mb_x
&& h
->slice_table
[mb_xy
- s
->mb_stride
- 1] == h
->slice_num
;
2900 h
->mb_avail
[1]= h
->slice_table
[mb_xy
- s
->mb_stride
] == h
->slice_num
;
2901 h
->mb_avail
[2]= s
->mb_x
+1 < s
->mb_width
&& h
->slice_table
[mb_xy
- s
->mb_stride
+ 1] == h
->slice_num
;
2907 h
->mb_avail
[3]= s
->mb_x
&& h
->slice_table
[mb_xy
- 1] == h
->slice_num
;
2908 h
->mb_avail
[4]= 1; //FIXME move out
2909 h
->mb_avail
[5]= 0; //FIXME move out
2917 #define SIZE (COUNT*40)
2923 // int int_temp[10000];
2925 AVCodecContext avctx
;
2927 dsputil_init(&dsp
, &avctx
);
2929 init_put_bits(&pb
, temp
, SIZE
);
2930 printf("testing unsigned exp golomb\n");
2931 for(i
=0; i
<COUNT
; i
++){
2933 set_ue_golomb(&pb
, i
);
2934 STOP_TIMER("set_ue_golomb");
2936 flush_put_bits(&pb
);
2938 init_get_bits(&gb
, temp
, 8*SIZE
);
2939 for(i
=0; i
<COUNT
; i
++){
2942 s
= show_bits(&gb
, 24);
2945 j
= get_ue_golomb(&gb
);
2947 printf("mismatch! at %d (%d should be %d) bits:%6X\n", i
, j
, i
, s
);
2950 STOP_TIMER("get_ue_golomb");
2954 init_put_bits(&pb
, temp
, SIZE
);
2955 printf("testing signed exp golomb\n");
2956 for(i
=0; i
<COUNT
; i
++){
2958 set_se_golomb(&pb
, i
- COUNT
/2);
2959 STOP_TIMER("set_se_golomb");
2961 flush_put_bits(&pb
);
2963 init_get_bits(&gb
, temp
, 8*SIZE
);
2964 for(i
=0; i
<COUNT
; i
++){
2967 s
= show_bits(&gb
, 24);
2970 j
= get_se_golomb(&gb
);
2971 if(j
!= i
- COUNT
/2){
2972 printf("mismatch! at %d (%d should be %d) bits:%6X\n", i
, j
, i
, s
);
2975 STOP_TIMER("get_se_golomb");
2979 printf("testing 4x4 (I)DCT\n");
2982 uint8_t src
[16], ref
[16];
2983 uint64_t error
= 0, max_error
=0;
2985 for(i
=0; i
<COUNT
; i
++){
2987 // printf("%d %d %d\n", r1, r2, (r2-r1)*16);
2988 for(j
=0; j
<16; j
++){
2989 ref
[j
]= random()%255;
2990 src
[j
]= random()%255;
2993 h264_diff_dct_c(block
, src
, ref
, 4);
2996 for(j
=0; j
<16; j
++){
2997 // printf("%d ", block[j]);
2998 block
[j
]= block
[j
]*4;
2999 if(j
&1) block
[j
]= (block
[j
]*4 + 2)/5;
3000 if(j
&4) block
[j
]= (block
[j
]*4 + 2)/5;
3004 s
->dsp
.h264_idct_add(ref
, block
, 4);
3005 /* for(j=0; j<16; j++){
3006 printf("%d ", ref[j]);
3010 for(j
=0; j
<16; j
++){
3011 int diff
= FFABS(src
[j
] - ref
[j
]);
3014 max_error
= FFMAX(max_error
, diff
);
3017 printf("error=%f max_error=%d\n", ((float)error
)/COUNT
/16, (int)max_error
);
3018 printf("testing quantizer\n");
3019 for(qp
=0; qp
<52; qp
++){
3021 src1_block
[i
]= src2_block
[i
]= random()%255;
3024 printf("Testing NAL layer\n");
3026 uint8_t bitstream
[COUNT
];
3027 uint8_t nal
[COUNT
*2];
3029 memset(&h
, 0, sizeof(H264Context
));
3031 for(i
=0; i
<COUNT
; i
++){
3039 for(j
=0; j
<COUNT
; j
++){
3040 bitstream
[j
]= (random() % 255) + 1;
3043 for(j
=0; j
<zeros
; j
++){
3044 int pos
= random() % COUNT
;
3045 while(bitstream
[pos
] == 0){
3054 nal_length
= encode_nal(&h
, nal
, bitstream
, COUNT
, COUNT
*2);
3056 printf("encoding failed\n");
3060 out
= ff_h264_decode_nal(&h
, nal
, &out_length
, &consumed
, nal_length
);
3064 if(out_length
!= COUNT
){
3065 printf("incorrect length %d %d\n", out_length
, COUNT
);
3069 if(consumed
!= nal_length
){
3070 printf("incorrect consumed length %d %d\n", nal_length
, consumed
);
3074 if(memcmp(bitstream
, out
, COUNT
)){
3075 printf("mismatch\n");
3081 printf("Testing RBSP\n");
3089 av_cold
void ff_h264_free_context(H264Context
*h
)
3093 free_tables(h
); //FIXME cleanup init stuff perhaps
3095 for(i
= 0; i
< MAX_SPS_COUNT
; i
++)
3096 av_freep(h
->sps_buffers
+ i
);
3098 for(i
= 0; i
< MAX_PPS_COUNT
; i
++)
3099 av_freep(h
->pps_buffers
+ i
);
3102 av_cold
int ff_h264_decode_end(AVCodecContext
*avctx
)
3104 H264Context
*h
= avctx
->priv_data
;
3105 MpegEncContext
*s
= &h
->s
;
3107 ff_h264_free_context(h
);
3111 // memset(h, 0, sizeof(H264Context));
3117 AVCodec h264_decoder
= {
3121 sizeof(H264Context
),
3122 ff_h264_decode_init
,
3126 /*CODEC_CAP_DRAW_HORIZ_BAND |*/ CODEC_CAP_DR1
| CODEC_CAP_DELAY
,
3128 .long_name
= NULL_IF_CONFIG_SMALL("H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10"),
3129 .pix_fmts
= ff_hwaccel_pixfmt_list_420
,
3132 #if CONFIG_H264_VDPAU_DECODER
3133 AVCodec h264_vdpau_decoder
= {
3137 sizeof(H264Context
),
3138 ff_h264_decode_init
,
3142 CODEC_CAP_DR1
| CODEC_CAP_DELAY
| CODEC_CAP_HWACCEL_VDPAU
,
3144 .long_name
= NULL_IF_CONFIG_SMALL("H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10 (VDPAU acceleration)"),
3145 .pix_fmts
= (const enum PixelFormat
[]){PIX_FMT_VDPAU_H264
, PIX_FMT_NONE
},