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 const uint8_t rem6
[52]={
47 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,
50 static const uint8_t div6
[52]={
51 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,
54 void ff_h264_write_back_intra_pred_mode(H264Context
*h
){
55 const int mb_xy
= h
->mb_xy
;
57 h
->intra4x4_pred_mode
[mb_xy
][0]= h
->intra4x4_pred_mode_cache
[7+8*1];
58 h
->intra4x4_pred_mode
[mb_xy
][1]= h
->intra4x4_pred_mode_cache
[7+8*2];
59 h
->intra4x4_pred_mode
[mb_xy
][2]= h
->intra4x4_pred_mode_cache
[7+8*3];
60 h
->intra4x4_pred_mode
[mb_xy
][3]= h
->intra4x4_pred_mode_cache
[7+8*4];
61 h
->intra4x4_pred_mode
[mb_xy
][4]= h
->intra4x4_pred_mode_cache
[4+8*4];
62 h
->intra4x4_pred_mode
[mb_xy
][5]= h
->intra4x4_pred_mode_cache
[5+8*4];
63 h
->intra4x4_pred_mode
[mb_xy
][6]= h
->intra4x4_pred_mode_cache
[6+8*4];
67 * checks if the top & left blocks are available if needed & changes the dc mode so it only uses the available blocks.
69 int ff_h264_check_intra4x4_pred_mode(H264Context
*h
){
70 MpegEncContext
* const s
= &h
->s
;
71 static const int8_t top
[12]= {-1, 0,LEFT_DC_PRED
,-1,-1,-1,-1,-1, 0};
72 static const int8_t left
[12]= { 0,-1, TOP_DC_PRED
, 0,-1,-1,-1, 0,-1,DC_128_PRED
};
75 if(!(h
->top_samples_available
&0x8000)){
77 int status
= top
[ h
->intra4x4_pred_mode_cache
[scan8
[0] + i
] ];
79 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
);
82 h
->intra4x4_pred_mode_cache
[scan8
[0] + i
]= status
;
87 if((h
->left_samples_available
&0x8888)!=0x8888){
88 static const int mask
[4]={0x8000,0x2000,0x80,0x20};
90 if(!(h
->left_samples_available
&mask
[i
])){
91 int status
= left
[ h
->intra4x4_pred_mode_cache
[scan8
[0] + 8*i
] ];
93 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
);
96 h
->intra4x4_pred_mode_cache
[scan8
[0] + 8*i
]= status
;
103 } //FIXME cleanup like ff_h264_check_intra_pred_mode
106 * checks if the top & left blocks are available if needed & changes the dc mode so it only uses the available blocks.
108 int ff_h264_check_intra_pred_mode(H264Context
*h
, int mode
){
109 MpegEncContext
* const s
= &h
->s
;
110 static const int8_t top
[7]= {LEFT_DC_PRED8x8
, 1,-1,-1};
111 static const int8_t left
[7]= { TOP_DC_PRED8x8
,-1, 2,-1,DC_128_PRED8x8
};
114 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
);
118 if(!(h
->top_samples_available
&0x8000)){
121 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
);
126 if((h
->left_samples_available
&0x8080) != 0x8080){
128 if(h
->left_samples_available
&0x8080){ //mad cow disease mode, aka MBAFF + constrained_intra_pred
129 mode
= ALZHEIMER_DC_L0T_PRED8x8
+ (!(h
->left_samples_available
&0x8000)) + 2*(mode
== DC_128_PRED8x8
);
132 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
);
140 const uint8_t *ff_h264_decode_nal(H264Context
*h
, const uint8_t *src
, int *dst_length
, int *consumed
, int length
){
145 // src[0]&0x80; //forbidden bit
146 h
->nal_ref_idc
= src
[0]>>5;
147 h
->nal_unit_type
= src
[0]&0x1F;
151 for(i
=0; i
<length
; i
++)
152 printf("%2X ", src
[i
]);
155 #if HAVE_FAST_UNALIGNED
158 for(i
=0; i
+1<length
; i
+=9){
159 if(!((~*(const uint64_t*)(src
+i
) & (*(const uint64_t*)(src
+i
) - 0x0100010001000101ULL
)) & 0x8000800080008080ULL
))
162 for(i
=0; i
+1<length
; i
+=5){
163 if(!((~*(const uint32_t*)(src
+i
) & (*(const uint32_t*)(src
+i
) - 0x01000101U
)) & 0x80008080U
))
166 if(i
>0 && !src
[i
]) i
--;
170 for(i
=0; i
+1<length
; i
+=2){
172 if(i
>0 && src
[i
-1]==0) i
--;
174 if(i
+2<length
&& src
[i
+1]==0 && src
[i
+2]<=3){
176 /* startcode, so we must be past the end */
184 if(i
>=length
-1){ //no escaped 0
186 *consumed
= length
+1; //+1 for the header
190 bufidx
= h
->nal_unit_type
== NAL_DPC ?
1 : 0; // use second escape buffer for inter data
191 av_fast_malloc(&h
->rbsp_buffer
[bufidx
], &h
->rbsp_buffer_size
[bufidx
], length
+FF_INPUT_BUFFER_PADDING_SIZE
);
192 dst
= h
->rbsp_buffer
[bufidx
];
198 //printf("decoding esc\n");
202 //remove escapes (very rare 1:2^22)
204 dst
[di
++]= src
[si
++];
205 dst
[di
++]= src
[si
++];
206 }else if(src
[si
]==0 && src
[si
+1]==0){
207 if(src
[si
+2]==3){ //escape
212 }else //next start code
216 dst
[di
++]= src
[si
++];
219 dst
[di
++]= src
[si
++];
222 memset(dst
+di
, 0, FF_INPUT_BUFFER_PADDING_SIZE
);
225 *consumed
= si
+ 1;//+1 for the header
226 //FIXME store exact number of bits in the getbitcontext (it is needed for decoding)
230 int ff_h264_decode_rbsp_trailing(H264Context
*h
, const uint8_t *src
){
234 tprintf(h
->s
.avctx
, "rbsp trailing %X\n", v
);
244 * IDCT transforms the 16 dc values and dequantizes them.
245 * @param qp quantization parameter
247 static void h264_luma_dc_dequant_idct_c(DCTELEM
*block
, int qp
, int qmul
){
250 int temp
[16]; //FIXME check if this is a good idea
251 static const int x_offset
[4]={0, 1*stride
, 4* stride
, 5*stride
};
252 static const int y_offset
[4]={0, 2*stride
, 8* stride
, 10*stride
};
254 //memset(block, 64, 2*256);
257 const int offset
= y_offset
[i
];
258 const int z0
= block
[offset
+stride
*0] + block
[offset
+stride
*4];
259 const int z1
= block
[offset
+stride
*0] - block
[offset
+stride
*4];
260 const int z2
= block
[offset
+stride
*1] - block
[offset
+stride
*5];
261 const int z3
= block
[offset
+stride
*1] + block
[offset
+stride
*5];
270 const int offset
= x_offset
[i
];
271 const int z0
= temp
[4*0+i
] + temp
[4*2+i
];
272 const int z1
= temp
[4*0+i
] - temp
[4*2+i
];
273 const int z2
= temp
[4*1+i
] - temp
[4*3+i
];
274 const int z3
= temp
[4*1+i
] + temp
[4*3+i
];
276 block
[stride
*0 +offset
]= ((((z0
+ z3
)*qmul
+ 128 ) >> 8)); //FIXME think about merging this into decode_residual
277 block
[stride
*2 +offset
]= ((((z1
+ z2
)*qmul
+ 128 ) >> 8));
278 block
[stride
*8 +offset
]= ((((z1
- z2
)*qmul
+ 128 ) >> 8));
279 block
[stride
*10+offset
]= ((((z0
- z3
)*qmul
+ 128 ) >> 8));
285 * DCT transforms the 16 dc values.
286 * @param qp quantization parameter ??? FIXME
288 static void h264_luma_dc_dct_c(DCTELEM
*block
/*, int qp*/){
289 // const int qmul= dequant_coeff[qp][0];
291 int temp
[16]; //FIXME check if this is a good idea
292 static const int x_offset
[4]={0, 1*stride
, 4* stride
, 5*stride
};
293 static const int y_offset
[4]={0, 2*stride
, 8* stride
, 10*stride
};
296 const int offset
= y_offset
[i
];
297 const int z0
= block
[offset
+stride
*0] + block
[offset
+stride
*4];
298 const int z1
= block
[offset
+stride
*0] - block
[offset
+stride
*4];
299 const int z2
= block
[offset
+stride
*1] - block
[offset
+stride
*5];
300 const int z3
= block
[offset
+stride
*1] + block
[offset
+stride
*5];
309 const int offset
= x_offset
[i
];
310 const int z0
= temp
[4*0+i
] + temp
[4*2+i
];
311 const int z1
= temp
[4*0+i
] - temp
[4*2+i
];
312 const int z2
= temp
[4*1+i
] - temp
[4*3+i
];
313 const int z3
= temp
[4*1+i
] + temp
[4*3+i
];
315 block
[stride
*0 +offset
]= (z0
+ z3
)>>1;
316 block
[stride
*2 +offset
]= (z1
+ z2
)>>1;
317 block
[stride
*8 +offset
]= (z1
- z2
)>>1;
318 block
[stride
*10+offset
]= (z0
- z3
)>>1;
326 static void chroma_dc_dequant_idct_c(DCTELEM
*block
, int qp
, int qmul
){
327 const int stride
= 16*2;
328 const int xStride
= 16;
331 a
= block
[stride
*0 + xStride
*0];
332 b
= block
[stride
*0 + xStride
*1];
333 c
= block
[stride
*1 + xStride
*0];
334 d
= block
[stride
*1 + xStride
*1];
341 block
[stride
*0 + xStride
*0]= ((a
+c
)*qmul
) >> 7;
342 block
[stride
*0 + xStride
*1]= ((e
+b
)*qmul
) >> 7;
343 block
[stride
*1 + xStride
*0]= ((a
-c
)*qmul
) >> 7;
344 block
[stride
*1 + xStride
*1]= ((e
-b
)*qmul
) >> 7;
348 static void chroma_dc_dct_c(DCTELEM
*block
){
349 const int stride
= 16*2;
350 const int xStride
= 16;
353 a
= block
[stride
*0 + xStride
*0];
354 b
= block
[stride
*0 + xStride
*1];
355 c
= block
[stride
*1 + xStride
*0];
356 d
= block
[stride
*1 + xStride
*1];
363 block
[stride
*0 + xStride
*0]= (a
+c
);
364 block
[stride
*0 + xStride
*1]= (e
+b
);
365 block
[stride
*1 + xStride
*0]= (a
-c
);
366 block
[stride
*1 + xStride
*1]= (e
-b
);
370 static inline void mc_dir_part(H264Context
*h
, Picture
*pic
, int n
, int square
, int chroma_height
, int delta
, int list
,
371 uint8_t *dest_y
, uint8_t *dest_cb
, uint8_t *dest_cr
,
372 int src_x_offset
, int src_y_offset
,
373 qpel_mc_func
*qpix_op
, h264_chroma_mc_func chroma_op
){
374 MpegEncContext
* const s
= &h
->s
;
375 const int mx
= h
->mv_cache
[list
][ scan8
[n
] ][0] + src_x_offset
*8;
376 int my
= h
->mv_cache
[list
][ scan8
[n
] ][1] + src_y_offset
*8;
377 const int luma_xy
= (mx
&3) + ((my
&3)<<2);
378 uint8_t * src_y
= pic
->data
[0] + (mx
>>2) + (my
>>2)*h
->mb_linesize
;
379 uint8_t * src_cb
, * src_cr
;
380 int extra_width
= h
->emu_edge_width
;
381 int extra_height
= h
->emu_edge_height
;
383 const int full_mx
= mx
>>2;
384 const int full_my
= my
>>2;
385 const int pic_width
= 16*s
->mb_width
;
386 const int pic_height
= 16*s
->mb_height
>> MB_FIELD
;
388 if(mx
&7) extra_width
-= 3;
389 if(my
&7) extra_height
-= 3;
391 if( full_mx
< 0-extra_width
392 || full_my
< 0-extra_height
393 || full_mx
+ 16/*FIXME*/ > pic_width
+ extra_width
394 || full_my
+ 16/*FIXME*/ > pic_height
+ extra_height
){
395 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
);
396 src_y
= s
->edge_emu_buffer
+ 2 + 2*h
->mb_linesize
;
400 qpix_op
[luma_xy
](dest_y
, src_y
, h
->mb_linesize
); //FIXME try variable height perhaps?
402 qpix_op
[luma_xy
](dest_y
+ delta
, src_y
+ delta
, h
->mb_linesize
);
405 if(CONFIG_GRAY
&& s
->flags
&CODEC_FLAG_GRAY
) return;
408 // chroma offset when predicting from a field of opposite parity
409 my
+= 2 * ((s
->mb_y
& 1) - (pic
->reference
- 1));
410 emu
|= (my
>>3) < 0 || (my
>>3) + 8 >= (pic_height
>>1);
412 src_cb
= pic
->data
[1] + (mx
>>3) + (my
>>3)*h
->mb_uvlinesize
;
413 src_cr
= pic
->data
[2] + (mx
>>3) + (my
>>3)*h
->mb_uvlinesize
;
416 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);
417 src_cb
= s
->edge_emu_buffer
;
419 chroma_op(dest_cb
, src_cb
, h
->mb_uvlinesize
, chroma_height
, mx
&7, my
&7);
422 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);
423 src_cr
= s
->edge_emu_buffer
;
425 chroma_op(dest_cr
, src_cr
, h
->mb_uvlinesize
, chroma_height
, mx
&7, my
&7);
428 static inline void mc_part_std(H264Context
*h
, int n
, int square
, int chroma_height
, int delta
,
429 uint8_t *dest_y
, uint8_t *dest_cb
, uint8_t *dest_cr
,
430 int x_offset
, int y_offset
,
431 qpel_mc_func
*qpix_put
, h264_chroma_mc_func chroma_put
,
432 qpel_mc_func
*qpix_avg
, h264_chroma_mc_func chroma_avg
,
433 int list0
, int list1
){
434 MpegEncContext
* const s
= &h
->s
;
435 qpel_mc_func
*qpix_op
= qpix_put
;
436 h264_chroma_mc_func chroma_op
= chroma_put
;
438 dest_y
+= 2*x_offset
+ 2*y_offset
*h
-> mb_linesize
;
439 dest_cb
+= x_offset
+ y_offset
*h
->mb_uvlinesize
;
440 dest_cr
+= x_offset
+ y_offset
*h
->mb_uvlinesize
;
441 x_offset
+= 8*s
->mb_x
;
442 y_offset
+= 8*(s
->mb_y
>> MB_FIELD
);
445 Picture
*ref
= &h
->ref_list
[0][ h
->ref_cache
[0][ scan8
[n
] ] ];
446 mc_dir_part(h
, ref
, n
, square
, chroma_height
, delta
, 0,
447 dest_y
, dest_cb
, dest_cr
, x_offset
, y_offset
,
451 chroma_op
= chroma_avg
;
455 Picture
*ref
= &h
->ref_list
[1][ h
->ref_cache
[1][ scan8
[n
] ] ];
456 mc_dir_part(h
, ref
, n
, square
, chroma_height
, delta
, 1,
457 dest_y
, dest_cb
, dest_cr
, x_offset
, y_offset
,
462 static inline void mc_part_weighted(H264Context
*h
, int n
, int square
, int chroma_height
, int delta
,
463 uint8_t *dest_y
, uint8_t *dest_cb
, uint8_t *dest_cr
,
464 int x_offset
, int y_offset
,
465 qpel_mc_func
*qpix_put
, h264_chroma_mc_func chroma_put
,
466 h264_weight_func luma_weight_op
, h264_weight_func chroma_weight_op
,
467 h264_biweight_func luma_weight_avg
, h264_biweight_func chroma_weight_avg
,
468 int list0
, int list1
){
469 MpegEncContext
* const s
= &h
->s
;
471 dest_y
+= 2*x_offset
+ 2*y_offset
*h
-> mb_linesize
;
472 dest_cb
+= x_offset
+ y_offset
*h
->mb_uvlinesize
;
473 dest_cr
+= x_offset
+ y_offset
*h
->mb_uvlinesize
;
474 x_offset
+= 8*s
->mb_x
;
475 y_offset
+= 8*(s
->mb_y
>> MB_FIELD
);
478 /* don't optimize for luma-only case, since B-frames usually
479 * use implicit weights => chroma too. */
480 uint8_t *tmp_cb
= s
->obmc_scratchpad
;
481 uint8_t *tmp_cr
= s
->obmc_scratchpad
+ 8;
482 uint8_t *tmp_y
= s
->obmc_scratchpad
+ 8*h
->mb_uvlinesize
;
483 int refn0
= h
->ref_cache
[0][ scan8
[n
] ];
484 int refn1
= h
->ref_cache
[1][ scan8
[n
] ];
486 mc_dir_part(h
, &h
->ref_list
[0][refn0
], n
, square
, chroma_height
, delta
, 0,
487 dest_y
, dest_cb
, dest_cr
,
488 x_offset
, y_offset
, qpix_put
, chroma_put
);
489 mc_dir_part(h
, &h
->ref_list
[1][refn1
], n
, square
, chroma_height
, delta
, 1,
490 tmp_y
, tmp_cb
, tmp_cr
,
491 x_offset
, y_offset
, qpix_put
, chroma_put
);
493 if(h
->use_weight
== 2){
494 int weight0
= h
->implicit_weight
[refn0
][refn1
];
495 int weight1
= 64 - weight0
;
496 luma_weight_avg( dest_y
, tmp_y
, h
-> mb_linesize
, 5, weight0
, weight1
, 0);
497 chroma_weight_avg(dest_cb
, tmp_cb
, h
->mb_uvlinesize
, 5, weight0
, weight1
, 0);
498 chroma_weight_avg(dest_cr
, tmp_cr
, h
->mb_uvlinesize
, 5, weight0
, weight1
, 0);
500 luma_weight_avg(dest_y
, tmp_y
, h
->mb_linesize
, h
->luma_log2_weight_denom
,
501 h
->luma_weight
[0][refn0
], h
->luma_weight
[1][refn1
],
502 h
->luma_offset
[0][refn0
] + h
->luma_offset
[1][refn1
]);
503 chroma_weight_avg(dest_cb
, tmp_cb
, h
->mb_uvlinesize
, h
->chroma_log2_weight_denom
,
504 h
->chroma_weight
[0][refn0
][0], h
->chroma_weight
[1][refn1
][0],
505 h
->chroma_offset
[0][refn0
][0] + h
->chroma_offset
[1][refn1
][0]);
506 chroma_weight_avg(dest_cr
, tmp_cr
, h
->mb_uvlinesize
, h
->chroma_log2_weight_denom
,
507 h
->chroma_weight
[0][refn0
][1], h
->chroma_weight
[1][refn1
][1],
508 h
->chroma_offset
[0][refn0
][1] + h
->chroma_offset
[1][refn1
][1]);
511 int list
= list1 ?
1 : 0;
512 int refn
= h
->ref_cache
[list
][ scan8
[n
] ];
513 Picture
*ref
= &h
->ref_list
[list
][refn
];
514 mc_dir_part(h
, ref
, n
, square
, chroma_height
, delta
, list
,
515 dest_y
, dest_cb
, dest_cr
, x_offset
, y_offset
,
516 qpix_put
, chroma_put
);
518 luma_weight_op(dest_y
, h
->mb_linesize
, h
->luma_log2_weight_denom
,
519 h
->luma_weight
[list
][refn
], h
->luma_offset
[list
][refn
]);
520 if(h
->use_weight_chroma
){
521 chroma_weight_op(dest_cb
, h
->mb_uvlinesize
, h
->chroma_log2_weight_denom
,
522 h
->chroma_weight
[list
][refn
][0], h
->chroma_offset
[list
][refn
][0]);
523 chroma_weight_op(dest_cr
, h
->mb_uvlinesize
, h
->chroma_log2_weight_denom
,
524 h
->chroma_weight
[list
][refn
][1], h
->chroma_offset
[list
][refn
][1]);
529 static inline void mc_part(H264Context
*h
, int n
, int square
, int chroma_height
, int delta
,
530 uint8_t *dest_y
, uint8_t *dest_cb
, uint8_t *dest_cr
,
531 int x_offset
, int y_offset
,
532 qpel_mc_func
*qpix_put
, h264_chroma_mc_func chroma_put
,
533 qpel_mc_func
*qpix_avg
, h264_chroma_mc_func chroma_avg
,
534 h264_weight_func
*weight_op
, h264_biweight_func
*weight_avg
,
535 int list0
, int list1
){
536 if((h
->use_weight
==2 && list0
&& list1
537 && (h
->implicit_weight
[ h
->ref_cache
[0][scan8
[n
]] ][ h
->ref_cache
[1][scan8
[n
]] ] != 32))
539 mc_part_weighted(h
, n
, square
, chroma_height
, delta
, dest_y
, dest_cb
, dest_cr
,
540 x_offset
, y_offset
, qpix_put
, chroma_put
,
541 weight_op
[0], weight_op
[3], weight_avg
[0], weight_avg
[3], list0
, list1
);
543 mc_part_std(h
, n
, square
, chroma_height
, delta
, dest_y
, dest_cb
, dest_cr
,
544 x_offset
, y_offset
, qpix_put
, chroma_put
, qpix_avg
, chroma_avg
, list0
, list1
);
547 static inline void prefetch_motion(H264Context
*h
, int list
){
548 /* fetch pixels for estimated mv 4 macroblocks ahead
549 * optimized for 64byte cache lines */
550 MpegEncContext
* const s
= &h
->s
;
551 const int refn
= h
->ref_cache
[list
][scan8
[0]];
553 const int mx
= (h
->mv_cache
[list
][scan8
[0]][0]>>2) + 16*s
->mb_x
+ 8;
554 const int my
= (h
->mv_cache
[list
][scan8
[0]][1]>>2) + 16*s
->mb_y
;
555 uint8_t **src
= h
->ref_list
[list
][refn
].data
;
556 int off
= mx
+ (my
+ (s
->mb_x
&3)*4)*h
->mb_linesize
+ 64;
557 s
->dsp
.prefetch(src
[0]+off
, s
->linesize
, 4);
558 off
= (mx
>>1) + ((my
>>1) + (s
->mb_x
&7))*s
->uvlinesize
+ 64;
559 s
->dsp
.prefetch(src
[1]+off
, src
[2]-src
[1], 2);
563 static void hl_motion(H264Context
*h
, uint8_t *dest_y
, uint8_t *dest_cb
, uint8_t *dest_cr
,
564 qpel_mc_func (*qpix_put
)[16], h264_chroma_mc_func (*chroma_put
),
565 qpel_mc_func (*qpix_avg
)[16], h264_chroma_mc_func (*chroma_avg
),
566 h264_weight_func
*weight_op
, h264_biweight_func
*weight_avg
){
567 MpegEncContext
* const s
= &h
->s
;
568 const int mb_xy
= h
->mb_xy
;
569 const int mb_type
= s
->current_picture
.mb_type
[mb_xy
];
571 assert(IS_INTER(mb_type
));
573 prefetch_motion(h
, 0);
575 if(IS_16X16(mb_type
)){
576 mc_part(h
, 0, 1, 8, 0, dest_y
, dest_cb
, dest_cr
, 0, 0,
577 qpix_put
[0], chroma_put
[0], qpix_avg
[0], chroma_avg
[0],
578 weight_op
, weight_avg
,
579 IS_DIR(mb_type
, 0, 0), IS_DIR(mb_type
, 0, 1));
580 }else if(IS_16X8(mb_type
)){
581 mc_part(h
, 0, 0, 4, 8, dest_y
, dest_cb
, dest_cr
, 0, 0,
582 qpix_put
[1], chroma_put
[0], qpix_avg
[1], chroma_avg
[0],
583 &weight_op
[1], &weight_avg
[1],
584 IS_DIR(mb_type
, 0, 0), IS_DIR(mb_type
, 0, 1));
585 mc_part(h
, 8, 0, 4, 8, dest_y
, dest_cb
, dest_cr
, 0, 4,
586 qpix_put
[1], chroma_put
[0], qpix_avg
[1], chroma_avg
[0],
587 &weight_op
[1], &weight_avg
[1],
588 IS_DIR(mb_type
, 1, 0), IS_DIR(mb_type
, 1, 1));
589 }else if(IS_8X16(mb_type
)){
590 mc_part(h
, 0, 0, 8, 8*h
->mb_linesize
, dest_y
, dest_cb
, dest_cr
, 0, 0,
591 qpix_put
[1], chroma_put
[1], qpix_avg
[1], chroma_avg
[1],
592 &weight_op
[2], &weight_avg
[2],
593 IS_DIR(mb_type
, 0, 0), IS_DIR(mb_type
, 0, 1));
594 mc_part(h
, 4, 0, 8, 8*h
->mb_linesize
, dest_y
, dest_cb
, dest_cr
, 4, 0,
595 qpix_put
[1], chroma_put
[1], qpix_avg
[1], chroma_avg
[1],
596 &weight_op
[2], &weight_avg
[2],
597 IS_DIR(mb_type
, 1, 0), IS_DIR(mb_type
, 1, 1));
601 assert(IS_8X8(mb_type
));
604 const int sub_mb_type
= h
->sub_mb_type
[i
];
606 int x_offset
= (i
&1)<<2;
607 int y_offset
= (i
&2)<<1;
609 if(IS_SUB_8X8(sub_mb_type
)){
610 mc_part(h
, n
, 1, 4, 0, dest_y
, dest_cb
, dest_cr
, x_offset
, y_offset
,
611 qpix_put
[1], chroma_put
[1], qpix_avg
[1], chroma_avg
[1],
612 &weight_op
[3], &weight_avg
[3],
613 IS_DIR(sub_mb_type
, 0, 0), IS_DIR(sub_mb_type
, 0, 1));
614 }else if(IS_SUB_8X4(sub_mb_type
)){
615 mc_part(h
, n
, 0, 2, 4, dest_y
, dest_cb
, dest_cr
, x_offset
, y_offset
,
616 qpix_put
[2], chroma_put
[1], qpix_avg
[2], chroma_avg
[1],
617 &weight_op
[4], &weight_avg
[4],
618 IS_DIR(sub_mb_type
, 0, 0), IS_DIR(sub_mb_type
, 0, 1));
619 mc_part(h
, n
+2, 0, 2, 4, dest_y
, dest_cb
, dest_cr
, x_offset
, y_offset
+2,
620 qpix_put
[2], chroma_put
[1], qpix_avg
[2], chroma_avg
[1],
621 &weight_op
[4], &weight_avg
[4],
622 IS_DIR(sub_mb_type
, 0, 0), IS_DIR(sub_mb_type
, 0, 1));
623 }else if(IS_SUB_4X8(sub_mb_type
)){
624 mc_part(h
, n
, 0, 4, 4*h
->mb_linesize
, dest_y
, dest_cb
, dest_cr
, x_offset
, y_offset
,
625 qpix_put
[2], chroma_put
[2], qpix_avg
[2], chroma_avg
[2],
626 &weight_op
[5], &weight_avg
[5],
627 IS_DIR(sub_mb_type
, 0, 0), IS_DIR(sub_mb_type
, 0, 1));
628 mc_part(h
, n
+1, 0, 4, 4*h
->mb_linesize
, dest_y
, dest_cb
, dest_cr
, x_offset
+2, y_offset
,
629 qpix_put
[2], chroma_put
[2], qpix_avg
[2], chroma_avg
[2],
630 &weight_op
[5], &weight_avg
[5],
631 IS_DIR(sub_mb_type
, 0, 0), IS_DIR(sub_mb_type
, 0, 1));
634 assert(IS_SUB_4X4(sub_mb_type
));
636 int sub_x_offset
= x_offset
+ 2*(j
&1);
637 int sub_y_offset
= y_offset
+ (j
&2);
638 mc_part(h
, n
+j
, 1, 2, 0, dest_y
, dest_cb
, dest_cr
, sub_x_offset
, sub_y_offset
,
639 qpix_put
[2], chroma_put
[2], qpix_avg
[2], chroma_avg
[2],
640 &weight_op
[6], &weight_avg
[6],
641 IS_DIR(sub_mb_type
, 0, 0), IS_DIR(sub_mb_type
, 0, 1));
647 prefetch_motion(h
, 1);
651 static void free_tables(H264Context
*h
){
654 av_freep(&h
->intra4x4_pred_mode
);
655 av_freep(&h
->chroma_pred_mode_table
);
656 av_freep(&h
->cbp_table
);
657 av_freep(&h
->mvd_table
[0]);
658 av_freep(&h
->mvd_table
[1]);
659 av_freep(&h
->direct_table
);
660 av_freep(&h
->non_zero_count
);
661 av_freep(&h
->slice_table_base
);
662 h
->slice_table
= NULL
;
663 av_freep(&h
->list_counts
);
665 av_freep(&h
->mb2b_xy
);
666 av_freep(&h
->mb2b8_xy
);
668 for(i
= 0; i
< MAX_THREADS
; i
++) {
669 hx
= h
->thread_context
[i
];
671 av_freep(&hx
->top_borders
[1]);
672 av_freep(&hx
->top_borders
[0]);
673 av_freep(&hx
->s
.obmc_scratchpad
);
674 av_freep(&hx
->rbsp_buffer
[1]);
675 av_freep(&hx
->rbsp_buffer
[0]);
676 hx
->rbsp_buffer_size
[0] = 0;
677 hx
->rbsp_buffer_size
[1] = 0;
678 if (i
) av_freep(&h
->thread_context
[i
]);
682 static void init_dequant8_coeff_table(H264Context
*h
){
684 const int transpose
= (h
->s
.dsp
.h264_idct8_add
!= ff_h264_idct8_add_c
); //FIXME ugly
685 h
->dequant8_coeff
[0] = h
->dequant8_buffer
[0];
686 h
->dequant8_coeff
[1] = h
->dequant8_buffer
[1];
689 if(i
&& !memcmp(h
->pps
.scaling_matrix8
[0], h
->pps
.scaling_matrix8
[1], 64*sizeof(uint8_t))){
690 h
->dequant8_coeff
[1] = h
->dequant8_buffer
[0];
698 h
->dequant8_coeff
[i
][q
][transpose ?
(x
>>3)|((x
&7)<<3) : x
] =
699 ((uint32_t)dequant8_coeff_init
[idx
][ dequant8_coeff_init_scan
[((x
>>1)&12) | (x
&3)] ] *
700 h
->pps
.scaling_matrix8
[i
][x
]) << shift
;
705 static void init_dequant4_coeff_table(H264Context
*h
){
707 const int transpose
= (h
->s
.dsp
.h264_idct_add
!= ff_h264_idct_add_c
); //FIXME ugly
709 h
->dequant4_coeff
[i
] = h
->dequant4_buffer
[i
];
711 if(!memcmp(h
->pps
.scaling_matrix4
[j
], h
->pps
.scaling_matrix4
[i
], 16*sizeof(uint8_t))){
712 h
->dequant4_coeff
[i
] = h
->dequant4_buffer
[j
];
720 int shift
= div6
[q
] + 2;
723 h
->dequant4_coeff
[i
][q
][transpose ?
(x
>>2)|((x
<<2)&0xF) : x
] =
724 ((uint32_t)dequant4_coeff_init
[idx
][(x
&1) + ((x
>>2)&1)] *
725 h
->pps
.scaling_matrix4
[i
][x
]) << shift
;
730 static void init_dequant_tables(H264Context
*h
){
732 init_dequant4_coeff_table(h
);
733 if(h
->pps
.transform_8x8_mode
)
734 init_dequant8_coeff_table(h
);
735 if(h
->sps
.transform_bypass
){
738 h
->dequant4_coeff
[i
][0][x
] = 1<<6;
739 if(h
->pps
.transform_8x8_mode
)
742 h
->dequant8_coeff
[i
][0][x
] = 1<<6;
747 int ff_h264_alloc_tables(H264Context
*h
){
748 MpegEncContext
* const s
= &h
->s
;
749 const int big_mb_num
= s
->mb_stride
* (s
->mb_height
+1);
752 FF_ALLOCZ_OR_GOTO(h
->s
.avctx
, h
->intra4x4_pred_mode
, big_mb_num
* 8 * sizeof(uint8_t), fail
)
754 FF_ALLOCZ_OR_GOTO(h
->s
.avctx
, h
->non_zero_count
, big_mb_num
* 32 * sizeof(uint8_t), fail
)
755 FF_ALLOCZ_OR_GOTO(h
->s
.avctx
, h
->slice_table_base
, (big_mb_num
+s
->mb_stride
) * sizeof(*h
->slice_table_base
), fail
)
756 FF_ALLOCZ_OR_GOTO(h
->s
.avctx
, h
->cbp_table
, big_mb_num
* sizeof(uint16_t), fail
)
758 FF_ALLOCZ_OR_GOTO(h
->s
.avctx
, h
->chroma_pred_mode_table
, big_mb_num
* sizeof(uint8_t), fail
)
759 FF_ALLOCZ_OR_GOTO(h
->s
.avctx
, h
->mvd_table
[0], 32*big_mb_num
* sizeof(uint16_t), fail
);
760 FF_ALLOCZ_OR_GOTO(h
->s
.avctx
, h
->mvd_table
[1], 32*big_mb_num
* sizeof(uint16_t), fail
);
761 FF_ALLOCZ_OR_GOTO(h
->s
.avctx
, h
->direct_table
, 32*big_mb_num
* sizeof(uint8_t) , fail
);
762 FF_ALLOCZ_OR_GOTO(h
->s
.avctx
, h
->list_counts
, big_mb_num
* sizeof(uint8_t), fail
)
764 memset(h
->slice_table_base
, -1, (big_mb_num
+s
->mb_stride
) * sizeof(*h
->slice_table_base
));
765 h
->slice_table
= h
->slice_table_base
+ s
->mb_stride
*2 + 1;
767 FF_ALLOCZ_OR_GOTO(h
->s
.avctx
, h
->mb2b_xy
, big_mb_num
* sizeof(uint32_t), fail
);
768 FF_ALLOCZ_OR_GOTO(h
->s
.avctx
, h
->mb2b8_xy
, big_mb_num
* sizeof(uint32_t), fail
);
769 for(y
=0; y
<s
->mb_height
; y
++){
770 for(x
=0; x
<s
->mb_width
; x
++){
771 const int mb_xy
= x
+ y
*s
->mb_stride
;
772 const int b_xy
= 4*x
+ 4*y
*h
->b_stride
;
773 const int b8_xy
= 2*x
+ 2*y
*h
->b8_stride
;
775 h
->mb2b_xy
[mb_xy
]= b_xy
;
776 h
->mb2b8_xy
[mb_xy
]= b8_xy
;
780 s
->obmc_scratchpad
= NULL
;
782 if(!h
->dequant4_coeff
[0])
783 init_dequant_tables(h
);
792 * Mimic alloc_tables(), but for every context thread.
794 static void clone_tables(H264Context
*dst
, H264Context
*src
){
795 dst
->intra4x4_pred_mode
= src
->intra4x4_pred_mode
;
796 dst
->non_zero_count
= src
->non_zero_count
;
797 dst
->slice_table
= src
->slice_table
;
798 dst
->cbp_table
= src
->cbp_table
;
799 dst
->mb2b_xy
= src
->mb2b_xy
;
800 dst
->mb2b8_xy
= src
->mb2b8_xy
;
801 dst
->chroma_pred_mode_table
= src
->chroma_pred_mode_table
;
802 dst
->mvd_table
[0] = src
->mvd_table
[0];
803 dst
->mvd_table
[1] = src
->mvd_table
[1];
804 dst
->direct_table
= src
->direct_table
;
805 dst
->list_counts
= src
->list_counts
;
807 dst
->s
.obmc_scratchpad
= NULL
;
808 ff_h264_pred_init(&dst
->hpc
, src
->s
.codec_id
);
813 * Allocate buffers which are not shared amongst multiple threads.
815 static int context_init(H264Context
*h
){
816 FF_ALLOCZ_OR_GOTO(h
->s
.avctx
, h
->top_borders
[0], h
->s
.mb_width
* (16+8+8) * sizeof(uint8_t), fail
)
817 FF_ALLOCZ_OR_GOTO(h
->s
.avctx
, h
->top_borders
[1], h
->s
.mb_width
* (16+8+8) * sizeof(uint8_t), fail
)
821 return -1; // free_tables will clean up for us
824 static av_cold
void common_init(H264Context
*h
){
825 MpegEncContext
* const s
= &h
->s
;
827 s
->width
= s
->avctx
->width
;
828 s
->height
= s
->avctx
->height
;
829 s
->codec_id
= s
->avctx
->codec
->id
;
831 ff_h264_pred_init(&h
->hpc
, s
->codec_id
);
833 h
->dequant_coeff_pps
= -1;
834 s
->unrestricted_mv
=1;
837 dsputil_init(&s
->dsp
, s
->avctx
); // needed so that idct permutation is known early
839 memset(h
->pps
.scaling_matrix4
, 16, 6*16*sizeof(uint8_t));
840 memset(h
->pps
.scaling_matrix8
, 16, 2*64*sizeof(uint8_t));
843 av_cold
int ff_h264_decode_init(AVCodecContext
*avctx
){
844 H264Context
*h
= avctx
->priv_data
;
845 MpegEncContext
* const s
= &h
->s
;
847 MPV_decode_defaults(s
);
852 s
->out_format
= FMT_H264
;
853 s
->workaround_bugs
= avctx
->workaround_bugs
;
856 // s->decode_mb= ff_h263_decode_mb;
857 s
->quarter_sample
= 1;
858 if(!avctx
->has_b_frames
)
861 avctx
->chroma_sample_location
= AVCHROMA_LOC_LEFT
;
863 ff_h264_decode_init_vlc();
865 if(avctx
->extradata_size
> 0 && avctx
->extradata
&&
866 *(char *)avctx
->extradata
== 1){
873 h
->thread_context
[0] = h
;
874 h
->outputed_poc
= INT_MIN
;
875 h
->prev_poc_msb
= 1<<16;
876 ff_h264_reset_sei(h
);
877 if(avctx
->codec_id
== CODEC_ID_H264
){
878 if(avctx
->ticks_per_frame
== 1){
879 s
->avctx
->time_base
.den
*=2;
881 avctx
->ticks_per_frame
= 2;
886 int ff_h264_frame_start(H264Context
*h
){
887 MpegEncContext
* const s
= &h
->s
;
890 if(MPV_frame_start(s
, s
->avctx
) < 0)
892 ff_er_frame_start(s
);
894 * MPV_frame_start uses pict_type to derive key_frame.
895 * This is incorrect for H.264; IDR markings must be used.
896 * Zero here; IDR markings per slice in frame or fields are ORed in later.
897 * See decode_nal_units().
899 s
->current_picture_ptr
->key_frame
= 0;
900 s
->current_picture_ptr
->mmco_reset
= 0;
902 assert(s
->linesize
&& s
->uvlinesize
);
905 h
->block_offset
[i
]= 4*((scan8
[i
] - scan8
[0])&7) + 4*s
->linesize
*((scan8
[i
] - scan8
[0])>>3);
906 h
->block_offset
[24+i
]= 4*((scan8
[i
] - scan8
[0])&7) + 8*s
->linesize
*((scan8
[i
] - scan8
[0])>>3);
909 h
->block_offset
[16+i
]=
910 h
->block_offset
[20+i
]= 4*((scan8
[i
] - scan8
[0])&7) + 4*s
->uvlinesize
*((scan8
[i
] - scan8
[0])>>3);
911 h
->block_offset
[24+16+i
]=
912 h
->block_offset
[24+20+i
]= 4*((scan8
[i
] - scan8
[0])&7) + 8*s
->uvlinesize
*((scan8
[i
] - scan8
[0])>>3);
915 /* can't be in alloc_tables because linesize isn't known there.
916 * FIXME: redo bipred weight to not require extra buffer? */
917 for(i
= 0; i
< s
->avctx
->thread_count
; i
++)
918 if(!h
->thread_context
[i
]->s
.obmc_scratchpad
)
919 h
->thread_context
[i
]->s
.obmc_scratchpad
= av_malloc(16*2*s
->linesize
+ 8*2*s
->uvlinesize
);
921 /* some macroblocks will be accessed before they're available */
922 if(FRAME_MBAFF
|| s
->avctx
->thread_count
> 1)
923 memset(h
->slice_table
, -1, (s
->mb_height
*s
->mb_stride
-1) * sizeof(*h
->slice_table
));
925 // s->decode= (s->flags&CODEC_FLAG_PSNR) || !s->encoding || s->current_picture.reference /*|| h->contains_intra*/ || 1;
927 // We mark the current picture as non-reference after allocating it, so
928 // that if we break out due to an error it can be released automatically
929 // in the next MPV_frame_start().
930 // SVQ3 as well as most other codecs have only last/next/current and thus
931 // get released even with set reference, besides SVQ3 and others do not
932 // mark frames as reference later "naturally".
933 if(s
->codec_id
!= CODEC_ID_SVQ3
)
934 s
->current_picture_ptr
->reference
= 0;
936 s
->current_picture_ptr
->field_poc
[0]=
937 s
->current_picture_ptr
->field_poc
[1]= INT_MAX
;
938 assert(s
->current_picture_ptr
->long_ref
==0);
943 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
){
944 MpegEncContext
* const s
= &h
->s
;
949 src_cb
-= uvlinesize
;
950 src_cr
-= uvlinesize
;
952 if(!simple
&& FRAME_MBAFF
){
955 top_border
= h
->top_borders
[0][s
->mb_x
];
956 AV_COPY128(top_border
, src_y
+ 15*linesize
);
957 if(simple
|| !CONFIG_GRAY
|| !(s
->flags
&CODEC_FLAG_GRAY
)){
958 AV_COPY64(top_border
+16, src_cb
+7*uvlinesize
);
959 AV_COPY64(top_border
+24, src_cr
+7*uvlinesize
);
968 top_border
= h
->top_borders
[top_idx
][s
->mb_x
];
969 // There are two lines saved, the line above the the top macroblock of a pair,
970 // and the line above the bottom macroblock
971 AV_COPY128(top_border
, src_y
+ 16*linesize
);
973 if(simple
|| !CONFIG_GRAY
|| !(s
->flags
&CODEC_FLAG_GRAY
)){
974 AV_COPY64(top_border
+16, src_cb
+8*uvlinesize
);
975 AV_COPY64(top_border
+24, src_cr
+8*uvlinesize
);
979 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
){
980 MpegEncContext
* const s
= &h
->s
;
987 uint8_t *top_border_m1
;
990 if(!simple
&& FRAME_MBAFF
){
995 top_idx
= MB_MBAFF ?
0 : 1;
999 if(h
->deblocking_filter
== 2) {
1001 deblock_left
= h
->slice_table
[mb_xy
] == h
->slice_table
[mb_xy
- 1];
1002 deblock_top
= h
->slice_table
[mb_xy
] == h
->slice_table
[h
->top_mb_xy
];
1004 deblock_left
= (s
->mb_x
> 0);
1005 deblock_top
= (s
->mb_y
> !!MB_FIELD
);
1008 src_y
-= linesize
+ 1;
1009 src_cb
-= uvlinesize
+ 1;
1010 src_cr
-= uvlinesize
+ 1;
1012 top_border_m1
= h
->top_borders
[top_idx
][s
->mb_x
-1];
1013 top_border
= h
->top_borders
[top_idx
][s
->mb_x
];
1015 #define XCHG(a,b,xchg)\
1016 if (xchg) AV_SWAP64(b,a);\
1017 else AV_COPY64(b,a);
1021 XCHG(top_border_m1
+8, src_y
-7, 1);
1023 XCHG(top_border
+0, src_y
+1, xchg
);
1024 XCHG(top_border
+8, src_y
+9, 1);
1025 if(s
->mb_x
+1 < s
->mb_width
){
1026 XCHG(h
->top_borders
[top_idx
][s
->mb_x
+1], src_y
+17, 1);
1030 if(simple
|| !CONFIG_GRAY
|| !(s
->flags
&CODEC_FLAG_GRAY
)){
1033 XCHG(top_border_m1
+16, src_cb
-7, 1);
1034 XCHG(top_border_m1
+24, src_cr
-7, 1);
1036 XCHG(top_border
+16, src_cb
+1, 1);
1037 XCHG(top_border
+24, src_cr
+1, 1);
1042 static av_always_inline
void hl_decode_mb_internal(H264Context
*h
, int simple
){
1043 MpegEncContext
* const s
= &h
->s
;
1044 const int mb_x
= s
->mb_x
;
1045 const int mb_y
= s
->mb_y
;
1046 const int mb_xy
= h
->mb_xy
;
1047 const int mb_type
= s
->current_picture
.mb_type
[mb_xy
];
1048 uint8_t *dest_y
, *dest_cb
, *dest_cr
;
1049 int linesize
, uvlinesize
/*dct_offset*/;
1051 int *block_offset
= &h
->block_offset
[0];
1052 const int transform_bypass
= !simple
&& (s
->qscale
== 0 && h
->sps
.transform_bypass
);
1053 /* is_h264 should always be true if SVQ3 is disabled. */
1054 const int is_h264
= !CONFIG_SVQ3_DECODER
|| simple
|| s
->codec_id
== CODEC_ID_H264
;
1055 void (*idct_add
)(uint8_t *dst
, DCTELEM
*block
, int stride
);
1056 void (*idct_dc_add
)(uint8_t *dst
, DCTELEM
*block
, int stride
);
1058 dest_y
= s
->current_picture
.data
[0] + (mb_x
+ mb_y
* s
->linesize
) * 16;
1059 dest_cb
= s
->current_picture
.data
[1] + (mb_x
+ mb_y
* s
->uvlinesize
) * 8;
1060 dest_cr
= s
->current_picture
.data
[2] + (mb_x
+ mb_y
* s
->uvlinesize
) * 8;
1062 s
->dsp
.prefetch(dest_y
+ (s
->mb_x
&3)*4*s
->linesize
+ 64, s
->linesize
, 4);
1063 s
->dsp
.prefetch(dest_cb
+ (s
->mb_x
&7)*s
->uvlinesize
+ 64, dest_cr
- dest_cb
, 2);
1065 h
->list_counts
[mb_xy
]= h
->list_count
;
1067 if (!simple
&& MB_FIELD
) {
1068 linesize
= h
->mb_linesize
= s
->linesize
* 2;
1069 uvlinesize
= h
->mb_uvlinesize
= s
->uvlinesize
* 2;
1070 block_offset
= &h
->block_offset
[24];
1071 if(mb_y
&1){ //FIXME move out of this function?
1072 dest_y
-= s
->linesize
*15;
1073 dest_cb
-= s
->uvlinesize
*7;
1074 dest_cr
-= s
->uvlinesize
*7;
1078 for(list
=0; list
<h
->list_count
; list
++){
1079 if(!USES_LIST(mb_type
, list
))
1081 if(IS_16X16(mb_type
)){
1082 int8_t *ref
= &h
->ref_cache
[list
][scan8
[0]];
1083 fill_rectangle(ref
, 4, 4, 8, (16+*ref
)^(s
->mb_y
&1), 1);
1085 for(i
=0; i
<16; i
+=4){
1086 int ref
= h
->ref_cache
[list
][scan8
[i
]];
1088 fill_rectangle(&h
->ref_cache
[list
][scan8
[i
]], 2, 2, 8, (16+ref
)^(s
->mb_y
&1), 1);
1094 linesize
= h
->mb_linesize
= s
->linesize
;
1095 uvlinesize
= h
->mb_uvlinesize
= s
->uvlinesize
;
1096 // dct_offset = s->linesize * 16;
1099 if (!simple
&& IS_INTRA_PCM(mb_type
)) {
1100 for (i
=0; i
<16; i
++) {
1101 memcpy(dest_y
+ i
* linesize
, h
->mb
+ i
*8, 16);
1103 for (i
=0; i
<8; i
++) {
1104 memcpy(dest_cb
+ i
*uvlinesize
, h
->mb
+ 128 + i
*4, 8);
1105 memcpy(dest_cr
+ i
*uvlinesize
, h
->mb
+ 160 + i
*4, 8);
1108 if(IS_INTRA(mb_type
)){
1109 if(h
->deblocking_filter
)
1110 xchg_mb_border(h
, dest_y
, dest_cb
, dest_cr
, linesize
, uvlinesize
, 1, simple
);
1112 if(simple
|| !CONFIG_GRAY
|| !(s
->flags
&CODEC_FLAG_GRAY
)){
1113 h
->hpc
.pred8x8
[ h
->chroma_pred_mode
](dest_cb
, uvlinesize
);
1114 h
->hpc
.pred8x8
[ h
->chroma_pred_mode
](dest_cr
, uvlinesize
);
1117 if(IS_INTRA4x4(mb_type
)){
1118 if(simple
|| !s
->encoding
){
1119 if(IS_8x8DCT(mb_type
)){
1120 if(transform_bypass
){
1122 idct_add
= s
->dsp
.add_pixels8
;
1124 idct_dc_add
= s
->dsp
.h264_idct8_dc_add
;
1125 idct_add
= s
->dsp
.h264_idct8_add
;
1127 for(i
=0; i
<16; i
+=4){
1128 uint8_t * const ptr
= dest_y
+ block_offset
[i
];
1129 const int dir
= h
->intra4x4_pred_mode_cache
[ scan8
[i
] ];
1130 if(transform_bypass
&& h
->sps
.profile_idc
==244 && dir
<=1){
1131 h
->hpc
.pred8x8l_add
[dir
](ptr
, h
->mb
+ i
*16, linesize
);
1133 const int nnz
= h
->non_zero_count_cache
[ scan8
[i
] ];
1134 h
->hpc
.pred8x8l
[ dir
](ptr
, (h
->topleft_samples_available
<<i
)&0x8000,
1135 (h
->topright_samples_available
<<i
)&0x4000, linesize
);
1137 if(nnz
== 1 && h
->mb
[i
*16])
1138 idct_dc_add(ptr
, h
->mb
+ i
*16, linesize
);
1140 idct_add (ptr
, h
->mb
+ i
*16, linesize
);
1145 if(transform_bypass
){
1147 idct_add
= s
->dsp
.add_pixels4
;
1149 idct_dc_add
= s
->dsp
.h264_idct_dc_add
;
1150 idct_add
= s
->dsp
.h264_idct_add
;
1152 for(i
=0; i
<16; i
++){
1153 uint8_t * const ptr
= dest_y
+ block_offset
[i
];
1154 const int dir
= h
->intra4x4_pred_mode_cache
[ scan8
[i
] ];
1156 if(transform_bypass
&& h
->sps
.profile_idc
==244 && dir
<=1){
1157 h
->hpc
.pred4x4_add
[dir
](ptr
, h
->mb
+ i
*16, linesize
);
1161 if(dir
== DIAG_DOWN_LEFT_PRED
|| dir
== VERT_LEFT_PRED
){
1162 const int topright_avail
= (h
->topright_samples_available
<<i
)&0x8000;
1163 assert(mb_y
|| linesize
<= block_offset
[i
]);
1164 if(!topright_avail
){
1165 tr
= ptr
[3 - linesize
]*0x01010101;
1166 topright
= (uint8_t*) &tr
;
1168 topright
= ptr
+ 4 - linesize
;
1172 h
->hpc
.pred4x4
[ dir
](ptr
, topright
, linesize
);
1173 nnz
= h
->non_zero_count_cache
[ scan8
[i
] ];
1176 if(nnz
== 1 && h
->mb
[i
*16])
1177 idct_dc_add(ptr
, h
->mb
+ i
*16, linesize
);
1179 idct_add (ptr
, h
->mb
+ i
*16, linesize
);
1181 ff_svq3_add_idct_c(ptr
, h
->mb
+ i
*16, linesize
, s
->qscale
, 0);
1188 h
->hpc
.pred16x16
[ h
->intra16x16_pred_mode
](dest_y
, linesize
);
1190 if(!transform_bypass
)
1191 h264_luma_dc_dequant_idct_c(h
->mb
, s
->qscale
, h
->dequant4_coeff
[0][s
->qscale
][0]);
1193 ff_svq3_luma_dc_dequant_idct_c(h
->mb
, s
->qscale
);
1195 if(h
->deblocking_filter
)
1196 xchg_mb_border(h
, dest_y
, dest_cb
, dest_cr
, linesize
, uvlinesize
, 0, simple
);
1198 hl_motion(h
, dest_y
, dest_cb
, dest_cr
,
1199 s
->me
.qpel_put
, s
->dsp
.put_h264_chroma_pixels_tab
,
1200 s
->me
.qpel_avg
, s
->dsp
.avg_h264_chroma_pixels_tab
,
1201 s
->dsp
.weight_h264_pixels_tab
, s
->dsp
.biweight_h264_pixels_tab
);
1205 if(!IS_INTRA4x4(mb_type
)){
1207 if(IS_INTRA16x16(mb_type
)){
1208 if(transform_bypass
){
1209 if(h
->sps
.profile_idc
==244 && (h
->intra16x16_pred_mode
==VERT_PRED8x8
|| h
->intra16x16_pred_mode
==HOR_PRED8x8
)){
1210 h
->hpc
.pred16x16_add
[h
->intra16x16_pred_mode
](dest_y
, block_offset
, h
->mb
, linesize
);
1212 for(i
=0; i
<16; i
++){
1213 if(h
->non_zero_count_cache
[ scan8
[i
] ] || h
->mb
[i
*16])
1214 s
->dsp
.add_pixels4(dest_y
+ block_offset
[i
], h
->mb
+ i
*16, linesize
);
1218 s
->dsp
.h264_idct_add16intra(dest_y
, block_offset
, h
->mb
, linesize
, h
->non_zero_count_cache
);
1220 }else if(h
->cbp
&15){
1221 if(transform_bypass
){
1222 const int di
= IS_8x8DCT(mb_type
) ?
4 : 1;
1223 idct_add
= IS_8x8DCT(mb_type
) ? s
->dsp
.add_pixels8
: s
->dsp
.add_pixels4
;
1224 for(i
=0; i
<16; i
+=di
){
1225 if(h
->non_zero_count_cache
[ scan8
[i
] ]){
1226 idct_add(dest_y
+ block_offset
[i
], h
->mb
+ i
*16, linesize
);
1230 if(IS_8x8DCT(mb_type
)){
1231 s
->dsp
.h264_idct8_add4(dest_y
, block_offset
, h
->mb
, linesize
, h
->non_zero_count_cache
);
1233 s
->dsp
.h264_idct_add16(dest_y
, block_offset
, h
->mb
, linesize
, h
->non_zero_count_cache
);
1238 for(i
=0; i
<16; i
++){
1239 if(h
->non_zero_count_cache
[ scan8
[i
] ] || h
->mb
[i
*16]){ //FIXME benchmark weird rule, & below
1240 uint8_t * const ptr
= dest_y
+ block_offset
[i
];
1241 ff_svq3_add_idct_c(ptr
, h
->mb
+ i
*16, linesize
, s
->qscale
, IS_INTRA(mb_type
) ?
1 : 0);
1247 if((simple
|| !CONFIG_GRAY
|| !(s
->flags
&CODEC_FLAG_GRAY
)) && (h
->cbp
&0x30)){
1248 uint8_t *dest
[2] = {dest_cb
, dest_cr
};
1249 if(transform_bypass
){
1250 if(IS_INTRA(mb_type
) && h
->sps
.profile_idc
==244 && (h
->chroma_pred_mode
==VERT_PRED8x8
|| h
->chroma_pred_mode
==HOR_PRED8x8
)){
1251 h
->hpc
.pred8x8_add
[h
->chroma_pred_mode
](dest
[0], block_offset
+ 16, h
->mb
+ 16*16, uvlinesize
);
1252 h
->hpc
.pred8x8_add
[h
->chroma_pred_mode
](dest
[1], block_offset
+ 20, h
->mb
+ 20*16, uvlinesize
);
1254 idct_add
= s
->dsp
.add_pixels4
;
1255 for(i
=16; i
<16+8; i
++){
1256 if(h
->non_zero_count_cache
[ scan8
[i
] ] || h
->mb
[i
*16])
1257 idct_add (dest
[(i
&4)>>2] + block_offset
[i
], h
->mb
+ i
*16, uvlinesize
);
1261 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]);
1262 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]);
1264 idct_add
= s
->dsp
.h264_idct_add
;
1265 idct_dc_add
= s
->dsp
.h264_idct_dc_add
;
1266 for(i
=16; i
<16+8; i
++){
1267 if(h
->non_zero_count_cache
[ scan8
[i
] ])
1268 idct_add (dest
[(i
&4)>>2] + block_offset
[i
], h
->mb
+ i
*16, uvlinesize
);
1269 else if(h
->mb
[i
*16])
1270 idct_dc_add(dest
[(i
&4)>>2] + block_offset
[i
], h
->mb
+ i
*16, uvlinesize
);
1273 for(i
=16; i
<16+8; i
++){
1274 if(h
->non_zero_count_cache
[ scan8
[i
] ] || h
->mb
[i
*16]){
1275 uint8_t * const ptr
= dest
[(i
&4)>>2] + block_offset
[i
];
1276 ff_svq3_add_idct_c(ptr
, h
->mb
+ i
*16, uvlinesize
, ff_h264_chroma_qp
[s
->qscale
+ 12] - 12, 2);
1283 if(h
->cbp
|| IS_INTRA(mb_type
))
1284 s
->dsp
.clear_blocks(h
->mb
);
1286 if(h
->deblocking_filter
&& 0) {
1287 backup_mb_border(h
, dest_y
, dest_cb
, dest_cr
, linesize
, uvlinesize
, simple
);
1288 fill_filter_caches(h
, mb_type
); //FIXME don't fill stuff which isn't used by filter_mb
1289 h
->chroma_qp
[0] = get_chroma_qp(h
, 0, s
->current_picture
.qscale_table
[mb_xy
]);
1290 h
->chroma_qp
[1] = get_chroma_qp(h
, 1, s
->current_picture
.qscale_table
[mb_xy
]);
1291 if (!simple
&& FRAME_MBAFF
) {
1292 ff_h264_filter_mb (h
, mb_x
, mb_y
, dest_y
, dest_cb
, dest_cr
, linesize
, uvlinesize
);
1294 ff_h264_filter_mb_fast(h
, mb_x
, mb_y
, dest_y
, dest_cb
, dest_cr
, linesize
, uvlinesize
);
1300 * Process a macroblock; this case avoids checks for expensive uncommon cases.
1302 static void hl_decode_mb_simple(H264Context
*h
){
1303 hl_decode_mb_internal(h
, 1);
1307 * Process a macroblock; this handles edge cases, such as interlacing.
1309 static void av_noinline
hl_decode_mb_complex(H264Context
*h
){
1310 hl_decode_mb_internal(h
, 0);
1313 void ff_h264_hl_decode_mb(H264Context
*h
){
1314 MpegEncContext
* const s
= &h
->s
;
1315 const int mb_xy
= h
->mb_xy
;
1316 const int mb_type
= s
->current_picture
.mb_type
[mb_xy
];
1317 int is_complex
= CONFIG_SMALL
|| h
->is_complex
|| IS_INTRA_PCM(mb_type
) || s
->qscale
== 0;
1320 hl_decode_mb_complex(h
);
1321 else hl_decode_mb_simple(h
);
1324 static int pred_weight_table(H264Context
*h
){
1325 MpegEncContext
* const s
= &h
->s
;
1327 int luma_def
, chroma_def
;
1330 h
->use_weight_chroma
= 0;
1331 h
->luma_log2_weight_denom
= get_ue_golomb(&s
->gb
);
1332 h
->chroma_log2_weight_denom
= get_ue_golomb(&s
->gb
);
1333 luma_def
= 1<<h
->luma_log2_weight_denom
;
1334 chroma_def
= 1<<h
->chroma_log2_weight_denom
;
1336 for(list
=0; list
<2; list
++){
1337 h
->luma_weight_flag
[list
] = 0;
1338 h
->chroma_weight_flag
[list
] = 0;
1339 for(i
=0; i
<h
->ref_count
[list
]; i
++){
1340 int luma_weight_flag
, chroma_weight_flag
;
1342 luma_weight_flag
= get_bits1(&s
->gb
);
1343 if(luma_weight_flag
){
1344 h
->luma_weight
[list
][i
]= get_se_golomb(&s
->gb
);
1345 h
->luma_offset
[list
][i
]= get_se_golomb(&s
->gb
);
1346 if( h
->luma_weight
[list
][i
] != luma_def
1347 || h
->luma_offset
[list
][i
] != 0) {
1349 h
->luma_weight_flag
[list
]= 1;
1352 h
->luma_weight
[list
][i
]= luma_def
;
1353 h
->luma_offset
[list
][i
]= 0;
1357 chroma_weight_flag
= get_bits1(&s
->gb
);
1358 if(chroma_weight_flag
){
1361 h
->chroma_weight
[list
][i
][j
]= get_se_golomb(&s
->gb
);
1362 h
->chroma_offset
[list
][i
][j
]= get_se_golomb(&s
->gb
);
1363 if( h
->chroma_weight
[list
][i
][j
] != chroma_def
1364 || h
->chroma_offset
[list
][i
][j
] != 0) {
1365 h
->use_weight_chroma
= 1;
1366 h
->chroma_weight_flag
[list
]= 1;
1372 h
->chroma_weight
[list
][i
][j
]= chroma_def
;
1373 h
->chroma_offset
[list
][i
][j
]= 0;
1378 if(h
->slice_type_nos
!= FF_B_TYPE
) break;
1380 h
->use_weight
= h
->use_weight
|| h
->use_weight_chroma
;
1384 static void implicit_weight_table(H264Context
*h
){
1385 MpegEncContext
* const s
= &h
->s
;
1387 int cur_poc
= s
->current_picture_ptr
->poc
;
1389 for (i
= 0; i
< 2; i
++) {
1390 h
->luma_weight_flag
[i
] = 0;
1391 h
->chroma_weight_flag
[i
] = 0;
1394 if( h
->ref_count
[0] == 1 && h
->ref_count
[1] == 1
1395 && h
->ref_list
[0][0].poc
+ h
->ref_list
[1][0].poc
== 2*cur_poc
){
1397 h
->use_weight_chroma
= 0;
1402 h
->use_weight_chroma
= 2;
1403 h
->luma_log2_weight_denom
= 5;
1404 h
->chroma_log2_weight_denom
= 5;
1406 for(ref0
=0; ref0
< h
->ref_count
[0]; ref0
++){
1407 int poc0
= h
->ref_list
[0][ref0
].poc
;
1408 for(ref1
=0; ref1
< h
->ref_count
[1]; ref1
++){
1409 int poc1
= h
->ref_list
[1][ref1
].poc
;
1410 int td
= av_clip(poc1
- poc0
, -128, 127);
1412 int tb
= av_clip(cur_poc
- poc0
, -128, 127);
1413 int tx
= (16384 + (FFABS(td
) >> 1)) / td
;
1414 int dist_scale_factor
= av_clip((tb
*tx
+ 32) >> 6, -1024, 1023) >> 2;
1415 if(dist_scale_factor
< -64 || dist_scale_factor
> 128)
1416 h
->implicit_weight
[ref0
][ref1
] = 32;
1418 h
->implicit_weight
[ref0
][ref1
] = 64 - dist_scale_factor
;
1420 h
->implicit_weight
[ref0
][ref1
] = 32;
1426 * instantaneous decoder refresh.
1428 static void idr(H264Context
*h
){
1429 ff_h264_remove_all_refs(h
);
1430 h
->prev_frame_num
= 0;
1431 h
->prev_frame_num_offset
= 0;
1436 /* forget old pics after a seek */
1437 static void flush_dpb(AVCodecContext
*avctx
){
1438 H264Context
*h
= avctx
->priv_data
;
1440 for(i
=0; i
<MAX_DELAYED_PIC_COUNT
; i
++) {
1441 if(h
->delayed_pic
[i
])
1442 h
->delayed_pic
[i
]->reference
= 0;
1443 h
->delayed_pic
[i
]= NULL
;
1445 h
->outputed_poc
= INT_MIN
;
1446 h
->prev_interlaced_frame
= 1;
1448 if(h
->s
.current_picture_ptr
)
1449 h
->s
.current_picture_ptr
->reference
= 0;
1450 h
->s
.first_field
= 0;
1451 ff_h264_reset_sei(h
);
1452 ff_mpeg_flush(avctx
);
1455 static int init_poc(H264Context
*h
){
1456 MpegEncContext
* const s
= &h
->s
;
1457 const int max_frame_num
= 1<<h
->sps
.log2_max_frame_num
;
1459 Picture
*cur
= s
->current_picture_ptr
;
1461 h
->frame_num_offset
= h
->prev_frame_num_offset
;
1462 if(h
->frame_num
< h
->prev_frame_num
)
1463 h
->frame_num_offset
+= max_frame_num
;
1465 if(h
->sps
.poc_type
==0){
1466 const int max_poc_lsb
= 1<<h
->sps
.log2_max_poc_lsb
;
1468 if (h
->poc_lsb
< h
->prev_poc_lsb
&& h
->prev_poc_lsb
- h
->poc_lsb
>= max_poc_lsb
/2)
1469 h
->poc_msb
= h
->prev_poc_msb
+ max_poc_lsb
;
1470 else if(h
->poc_lsb
> h
->prev_poc_lsb
&& h
->prev_poc_lsb
- h
->poc_lsb
< -max_poc_lsb
/2)
1471 h
->poc_msb
= h
->prev_poc_msb
- max_poc_lsb
;
1473 h
->poc_msb
= h
->prev_poc_msb
;
1474 //printf("poc: %d %d\n", h->poc_msb, h->poc_lsb);
1476 field_poc
[1] = h
->poc_msb
+ h
->poc_lsb
;
1477 if(s
->picture_structure
== PICT_FRAME
)
1478 field_poc
[1] += h
->delta_poc_bottom
;
1479 }else if(h
->sps
.poc_type
==1){
1480 int abs_frame_num
, expected_delta_per_poc_cycle
, expectedpoc
;
1483 if(h
->sps
.poc_cycle_length
!= 0)
1484 abs_frame_num
= h
->frame_num_offset
+ h
->frame_num
;
1488 if(h
->nal_ref_idc
==0 && abs_frame_num
> 0)
1491 expected_delta_per_poc_cycle
= 0;
1492 for(i
=0; i
< h
->sps
.poc_cycle_length
; i
++)
1493 expected_delta_per_poc_cycle
+= h
->sps
.offset_for_ref_frame
[ i
]; //FIXME integrate during sps parse
1495 if(abs_frame_num
> 0){
1496 int poc_cycle_cnt
= (abs_frame_num
- 1) / h
->sps
.poc_cycle_length
;
1497 int frame_num_in_poc_cycle
= (abs_frame_num
- 1) % h
->sps
.poc_cycle_length
;
1499 expectedpoc
= poc_cycle_cnt
* expected_delta_per_poc_cycle
;
1500 for(i
= 0; i
<= frame_num_in_poc_cycle
; i
++)
1501 expectedpoc
= expectedpoc
+ h
->sps
.offset_for_ref_frame
[ i
];
1505 if(h
->nal_ref_idc
== 0)
1506 expectedpoc
= expectedpoc
+ h
->sps
.offset_for_non_ref_pic
;
1508 field_poc
[0] = expectedpoc
+ h
->delta_poc
[0];
1509 field_poc
[1] = field_poc
[0] + h
->sps
.offset_for_top_to_bottom_field
;
1511 if(s
->picture_structure
== PICT_FRAME
)
1512 field_poc
[1] += h
->delta_poc
[1];
1514 int poc
= 2*(h
->frame_num_offset
+ h
->frame_num
);
1523 if(s
->picture_structure
!= PICT_BOTTOM_FIELD
)
1524 s
->current_picture_ptr
->field_poc
[0]= field_poc
[0];
1525 if(s
->picture_structure
!= PICT_TOP_FIELD
)
1526 s
->current_picture_ptr
->field_poc
[1]= field_poc
[1];
1527 cur
->poc
= FFMIN(cur
->field_poc
[0], cur
->field_poc
[1]);
1534 * initialize scan tables
1536 static void init_scan_tables(H264Context
*h
){
1537 MpegEncContext
* const s
= &h
->s
;
1539 if(s
->dsp
.h264_idct_add
== ff_h264_idct_add_c
){ //FIXME little ugly
1540 memcpy(h
->zigzag_scan
, zigzag_scan
, 16*sizeof(uint8_t));
1541 memcpy(h
-> field_scan
, field_scan
, 16*sizeof(uint8_t));
1543 for(i
=0; i
<16; i
++){
1544 #define T(x) (x>>2) | ((x<<2) & 0xF)
1545 h
->zigzag_scan
[i
] = T(zigzag_scan
[i
]);
1546 h
-> field_scan
[i
] = T( field_scan
[i
]);
1550 if(s
->dsp
.h264_idct8_add
== ff_h264_idct8_add_c
){
1551 memcpy(h
->zigzag_scan8x8
, ff_zigzag_direct
, 64*sizeof(uint8_t));
1552 memcpy(h
->zigzag_scan8x8_cavlc
, zigzag_scan8x8_cavlc
, 64*sizeof(uint8_t));
1553 memcpy(h
->field_scan8x8
, field_scan8x8
, 64*sizeof(uint8_t));
1554 memcpy(h
->field_scan8x8_cavlc
, field_scan8x8_cavlc
, 64*sizeof(uint8_t));
1556 for(i
=0; i
<64; i
++){
1557 #define T(x) (x>>3) | ((x&7)<<3)
1558 h
->zigzag_scan8x8
[i
] = T(ff_zigzag_direct
[i
]);
1559 h
->zigzag_scan8x8_cavlc
[i
] = T(zigzag_scan8x8_cavlc
[i
]);
1560 h
->field_scan8x8
[i
] = T(field_scan8x8
[i
]);
1561 h
->field_scan8x8_cavlc
[i
] = T(field_scan8x8_cavlc
[i
]);
1565 if(h
->sps
.transform_bypass
){ //FIXME same ugly
1566 h
->zigzag_scan_q0
= zigzag_scan
;
1567 h
->zigzag_scan8x8_q0
= ff_zigzag_direct
;
1568 h
->zigzag_scan8x8_cavlc_q0
= zigzag_scan8x8_cavlc
;
1569 h
->field_scan_q0
= field_scan
;
1570 h
->field_scan8x8_q0
= field_scan8x8
;
1571 h
->field_scan8x8_cavlc_q0
= field_scan8x8_cavlc
;
1573 h
->zigzag_scan_q0
= h
->zigzag_scan
;
1574 h
->zigzag_scan8x8_q0
= h
->zigzag_scan8x8
;
1575 h
->zigzag_scan8x8_cavlc_q0
= h
->zigzag_scan8x8_cavlc
;
1576 h
->field_scan_q0
= h
->field_scan
;
1577 h
->field_scan8x8_q0
= h
->field_scan8x8
;
1578 h
->field_scan8x8_cavlc_q0
= h
->field_scan8x8_cavlc
;
1582 static void field_end(H264Context
*h
){
1583 MpegEncContext
* const s
= &h
->s
;
1584 AVCodecContext
* const avctx
= s
->avctx
;
1587 s
->current_picture_ptr
->qscale_type
= FF_QSCALE_TYPE_H264
;
1588 s
->current_picture_ptr
->pict_type
= s
->pict_type
;
1590 if (CONFIG_H264_VDPAU_DECODER
&& s
->avctx
->codec
->capabilities
&CODEC_CAP_HWACCEL_VDPAU
)
1591 ff_vdpau_h264_set_reference_frames(s
);
1594 ff_h264_execute_ref_pic_marking(h
, h
->mmco
, h
->mmco_index
);
1595 h
->prev_poc_msb
= h
->poc_msb
;
1596 h
->prev_poc_lsb
= h
->poc_lsb
;
1598 h
->prev_frame_num_offset
= h
->frame_num_offset
;
1599 h
->prev_frame_num
= h
->frame_num
;
1601 if (avctx
->hwaccel
) {
1602 if (avctx
->hwaccel
->end_frame(avctx
) < 0)
1603 av_log(avctx
, AV_LOG_ERROR
, "hardware accelerator failed to decode picture\n");
1606 if (CONFIG_H264_VDPAU_DECODER
&& s
->avctx
->codec
->capabilities
&CODEC_CAP_HWACCEL_VDPAU
)
1607 ff_vdpau_h264_picture_complete(s
);
1610 * FIXME: Error handling code does not seem to support interlaced
1611 * when slices span multiple rows
1612 * The ff_er_add_slice calls don't work right for bottom
1613 * fields; they cause massive erroneous error concealing
1614 * Error marking covers both fields (top and bottom).
1615 * This causes a mismatched s->error_count
1616 * and a bad error table. Further, the error count goes to
1617 * INT_MAX when called for bottom field, because mb_y is
1618 * past end by one (callers fault) and resync_mb_y != 0
1619 * causes problems for the first MB line, too.
1630 * Replicates H264 "master" context to thread contexts.
1632 static void clone_slice(H264Context
*dst
, H264Context
*src
)
1634 memcpy(dst
->block_offset
, src
->block_offset
, sizeof(dst
->block_offset
));
1635 dst
->s
.current_picture_ptr
= src
->s
.current_picture_ptr
;
1636 dst
->s
.current_picture
= src
->s
.current_picture
;
1637 dst
->s
.linesize
= src
->s
.linesize
;
1638 dst
->s
.uvlinesize
= src
->s
.uvlinesize
;
1639 dst
->s
.first_field
= src
->s
.first_field
;
1641 dst
->prev_poc_msb
= src
->prev_poc_msb
;
1642 dst
->prev_poc_lsb
= src
->prev_poc_lsb
;
1643 dst
->prev_frame_num_offset
= src
->prev_frame_num_offset
;
1644 dst
->prev_frame_num
= src
->prev_frame_num
;
1645 dst
->short_ref_count
= src
->short_ref_count
;
1647 memcpy(dst
->short_ref
, src
->short_ref
, sizeof(dst
->short_ref
));
1648 memcpy(dst
->long_ref
, src
->long_ref
, sizeof(dst
->long_ref
));
1649 memcpy(dst
->default_ref_list
, src
->default_ref_list
, sizeof(dst
->default_ref_list
));
1650 memcpy(dst
->ref_list
, src
->ref_list
, sizeof(dst
->ref_list
));
1652 memcpy(dst
->dequant4_coeff
, src
->dequant4_coeff
, sizeof(src
->dequant4_coeff
));
1653 memcpy(dst
->dequant8_coeff
, src
->dequant8_coeff
, sizeof(src
->dequant8_coeff
));
1657 * decodes a slice header.
1658 * This will also call MPV_common_init() and frame_start() as needed.
1660 * @param h h264context
1661 * @param h0 h264 master context (differs from 'h' when doing sliced based parallel decoding)
1663 * @return 0 if okay, <0 if an error occurred, 1 if decoding must not be multithreaded
1665 static int decode_slice_header(H264Context
*h
, H264Context
*h0
){
1666 MpegEncContext
* const s
= &h
->s
;
1667 MpegEncContext
* const s0
= &h0
->s
;
1668 unsigned int first_mb_in_slice
;
1669 unsigned int pps_id
;
1670 int num_ref_idx_active_override_flag
;
1671 unsigned int slice_type
, tmp
, i
, j
;
1672 int default_ref_list_done
= 0;
1673 int last_pic_structure
;
1675 s
->dropable
= h
->nal_ref_idc
== 0;
1677 if((s
->avctx
->flags2
& CODEC_FLAG2_FAST
) && !h
->nal_ref_idc
){
1678 s
->me
.qpel_put
= s
->dsp
.put_2tap_qpel_pixels_tab
;
1679 s
->me
.qpel_avg
= s
->dsp
.avg_2tap_qpel_pixels_tab
;
1681 s
->me
.qpel_put
= s
->dsp
.put_h264_qpel_pixels_tab
;
1682 s
->me
.qpel_avg
= s
->dsp
.avg_h264_qpel_pixels_tab
;
1685 first_mb_in_slice
= get_ue_golomb(&s
->gb
);
1687 if(first_mb_in_slice
== 0){ //FIXME better field boundary detection
1688 if(h0
->current_slice
&& FIELD_PICTURE
){
1692 h0
->current_slice
= 0;
1693 if (!s0
->first_field
)
1694 s
->current_picture_ptr
= NULL
;
1697 slice_type
= get_ue_golomb_31(&s
->gb
);
1699 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
);
1704 h
->slice_type_fixed
=1;
1706 h
->slice_type_fixed
=0;
1708 slice_type
= golomb_to_pict_type
[ slice_type
];
1709 if (slice_type
== FF_I_TYPE
1710 || (h0
->current_slice
!= 0 && slice_type
== h0
->last_slice_type
) ) {
1711 default_ref_list_done
= 1;
1713 h
->slice_type
= slice_type
;
1714 h
->slice_type_nos
= slice_type
& 3;
1716 s
->pict_type
= h
->slice_type
; // to make a few old functions happy, it's wrong though
1717 if (s
->pict_type
== FF_B_TYPE
&& s0
->last_picture_ptr
== NULL
) {
1718 av_log(h
->s
.avctx
, AV_LOG_ERROR
,
1719 "B picture before any references, skipping\n");
1723 pps_id
= get_ue_golomb(&s
->gb
);
1724 if(pps_id
>=MAX_PPS_COUNT
){
1725 av_log(h
->s
.avctx
, AV_LOG_ERROR
, "pps_id out of range\n");
1728 if(!h0
->pps_buffers
[pps_id
]) {
1729 av_log(h
->s
.avctx
, AV_LOG_ERROR
, "non-existing PPS %u referenced\n", pps_id
);
1732 h
->pps
= *h0
->pps_buffers
[pps_id
];
1734 if(!h0
->sps_buffers
[h
->pps
.sps_id
]) {
1735 av_log(h
->s
.avctx
, AV_LOG_ERROR
, "non-existing SPS %u referenced\n", h
->pps
.sps_id
);
1738 h
->sps
= *h0
->sps_buffers
[h
->pps
.sps_id
];
1740 if(h
== h0
&& h
->dequant_coeff_pps
!= pps_id
){
1741 h
->dequant_coeff_pps
= pps_id
;
1742 init_dequant_tables(h
);
1745 s
->mb_width
= h
->sps
.mb_width
;
1746 s
->mb_height
= h
->sps
.mb_height
* (2 - h
->sps
.frame_mbs_only_flag
);
1748 h
->b_stride
= s
->mb_width
*4;
1749 h
->b8_stride
= s
->mb_width
*2;
1751 s
->width
= 16*s
->mb_width
- 2*FFMIN(h
->sps
.crop_right
, 7);
1752 if(h
->sps
.frame_mbs_only_flag
)
1753 s
->height
= 16*s
->mb_height
- 2*FFMIN(h
->sps
.crop_bottom
, 7);
1755 s
->height
= 16*s
->mb_height
- 4*FFMIN(h
->sps
.crop_bottom
, 3);
1757 if (s
->context_initialized
1758 && ( s
->width
!= s
->avctx
->width
|| s
->height
!= s
->avctx
->height
)) {
1760 return -1; // width / height changed during parallelized decoding
1762 flush_dpb(s
->avctx
);
1765 if (!s
->context_initialized
) {
1767 return -1; // we cant (re-)initialize context during parallel decoding
1769 avcodec_set_dimensions(s
->avctx
, s
->width
, s
->height
);
1770 s
->avctx
->sample_aspect_ratio
= h
->sps
.sar
;
1771 if(!s
->avctx
->sample_aspect_ratio
.den
)
1772 s
->avctx
->sample_aspect_ratio
.den
= 1;
1774 if(h
->sps
.video_signal_type_present_flag
){
1775 s
->avctx
->color_range
= h
->sps
.full_range ? AVCOL_RANGE_JPEG
: AVCOL_RANGE_MPEG
;
1776 if(h
->sps
.colour_description_present_flag
){
1777 s
->avctx
->color_primaries
= h
->sps
.color_primaries
;
1778 s
->avctx
->color_trc
= h
->sps
.color_trc
;
1779 s
->avctx
->colorspace
= h
->sps
.colorspace
;
1783 if(h
->sps
.timing_info_present_flag
){
1784 s
->avctx
->time_base
= (AVRational
){h
->sps
.num_units_in_tick
, h
->sps
.time_scale
};
1785 if(h
->x264_build
> 0 && h
->x264_build
< 44)
1786 s
->avctx
->time_base
.den
*= 2;
1787 av_reduce(&s
->avctx
->time_base
.num
, &s
->avctx
->time_base
.den
,
1788 s
->avctx
->time_base
.num
, s
->avctx
->time_base
.den
, 1<<30);
1790 s
->avctx
->pix_fmt
= s
->avctx
->get_format(s
->avctx
, s
->avctx
->codec
->pix_fmts
);
1791 s
->avctx
->hwaccel
= ff_find_hwaccel(s
->avctx
->codec
->id
, s
->avctx
->pix_fmt
);
1793 if (MPV_common_init(s
) < 0)
1796 h
->prev_interlaced_frame
= 1;
1798 init_scan_tables(h
);
1799 ff_h264_alloc_tables(h
);
1801 for(i
= 1; i
< s
->avctx
->thread_count
; i
++) {
1803 c
= h
->thread_context
[i
] = av_malloc(sizeof(H264Context
));
1804 memcpy(c
, h
->s
.thread_context
[i
], sizeof(MpegEncContext
));
1805 memset(&c
->s
+ 1, 0, sizeof(H264Context
) - sizeof(MpegEncContext
));
1808 init_scan_tables(c
);
1812 for(i
= 0; i
< s
->avctx
->thread_count
; i
++)
1813 if(context_init(h
->thread_context
[i
]) < 0)
1817 h
->frame_num
= get_bits(&s
->gb
, h
->sps
.log2_max_frame_num
);
1820 h
->mb_aff_frame
= 0;
1821 last_pic_structure
= s0
->picture_structure
;
1822 if(h
->sps
.frame_mbs_only_flag
){
1823 s
->picture_structure
= PICT_FRAME
;
1825 if(get_bits1(&s
->gb
)) { //field_pic_flag
1826 s
->picture_structure
= PICT_TOP_FIELD
+ get_bits1(&s
->gb
); //bottom_field_flag
1828 s
->picture_structure
= PICT_FRAME
;
1829 h
->mb_aff_frame
= h
->sps
.mb_aff
;
1832 h
->mb_field_decoding_flag
= s
->picture_structure
!= PICT_FRAME
;
1834 if(h0
->current_slice
== 0){
1835 while(h
->frame_num
!= h
->prev_frame_num
&&
1836 h
->frame_num
!= (h
->prev_frame_num
+1)%(1<<h
->sps
.log2_max_frame_num
)){
1837 av_log(NULL
, AV_LOG_DEBUG
, "Frame num gap %d %d\n", h
->frame_num
, h
->prev_frame_num
);
1838 if (ff_h264_frame_start(h
) < 0)
1840 h
->prev_frame_num
++;
1841 h
->prev_frame_num
%= 1<<h
->sps
.log2_max_frame_num
;
1842 s
->current_picture_ptr
->frame_num
= h
->prev_frame_num
;
1843 ff_h264_execute_ref_pic_marking(h
, NULL
, 0);
1846 /* See if we have a decoded first field looking for a pair... */
1847 if (s0
->first_field
) {
1848 assert(s0
->current_picture_ptr
);
1849 assert(s0
->current_picture_ptr
->data
[0]);
1850 assert(s0
->current_picture_ptr
->reference
!= DELAYED_PIC_REF
);
1852 /* figure out if we have a complementary field pair */
1853 if (!FIELD_PICTURE
|| s
->picture_structure
== last_pic_structure
) {
1855 * Previous field is unmatched. Don't display it, but let it
1856 * remain for reference if marked as such.
1858 s0
->current_picture_ptr
= NULL
;
1859 s0
->first_field
= FIELD_PICTURE
;
1862 if (h
->nal_ref_idc
&&
1863 s0
->current_picture_ptr
->reference
&&
1864 s0
->current_picture_ptr
->frame_num
!= h
->frame_num
) {
1866 * This and previous field were reference, but had
1867 * different frame_nums. Consider this field first in
1868 * pair. Throw away previous field except for reference
1871 s0
->first_field
= 1;
1872 s0
->current_picture_ptr
= NULL
;
1875 /* Second field in complementary pair */
1876 s0
->first_field
= 0;
1881 /* Frame or first field in a potentially complementary pair */
1882 assert(!s0
->current_picture_ptr
);
1883 s0
->first_field
= FIELD_PICTURE
;
1886 if((!FIELD_PICTURE
|| s0
->first_field
) && ff_h264_frame_start(h
) < 0) {
1887 s0
->first_field
= 0;
1894 s
->current_picture_ptr
->frame_num
= h
->frame_num
; //FIXME frame_num cleanup
1896 assert(s
->mb_num
== s
->mb_width
* s
->mb_height
);
1897 if(first_mb_in_slice
<< FIELD_OR_MBAFF_PICTURE
>= s
->mb_num
||
1898 first_mb_in_slice
>= s
->mb_num
){
1899 av_log(h
->s
.avctx
, AV_LOG_ERROR
, "first_mb_in_slice overflow\n");
1902 s
->resync_mb_x
= s
->mb_x
= first_mb_in_slice
% s
->mb_width
;
1903 s
->resync_mb_y
= s
->mb_y
= (first_mb_in_slice
/ s
->mb_width
) << FIELD_OR_MBAFF_PICTURE
;
1904 if (s
->picture_structure
== PICT_BOTTOM_FIELD
)
1905 s
->resync_mb_y
= s
->mb_y
= s
->mb_y
+ 1;
1906 assert(s
->mb_y
< s
->mb_height
);
1908 if(s
->picture_structure
==PICT_FRAME
){
1909 h
->curr_pic_num
= h
->frame_num
;
1910 h
->max_pic_num
= 1<< h
->sps
.log2_max_frame_num
;
1912 h
->curr_pic_num
= 2*h
->frame_num
+ 1;
1913 h
->max_pic_num
= 1<<(h
->sps
.log2_max_frame_num
+ 1);
1916 if(h
->nal_unit_type
== NAL_IDR_SLICE
){
1917 get_ue_golomb(&s
->gb
); /* idr_pic_id */
1920 if(h
->sps
.poc_type
==0){
1921 h
->poc_lsb
= get_bits(&s
->gb
, h
->sps
.log2_max_poc_lsb
);
1923 if(h
->pps
.pic_order_present
==1 && s
->picture_structure
==PICT_FRAME
){
1924 h
->delta_poc_bottom
= get_se_golomb(&s
->gb
);
1928 if(h
->sps
.poc_type
==1 && !h
->sps
.delta_pic_order_always_zero_flag
){
1929 h
->delta_poc
[0]= get_se_golomb(&s
->gb
);
1931 if(h
->pps
.pic_order_present
==1 && s
->picture_structure
==PICT_FRAME
)
1932 h
->delta_poc
[1]= get_se_golomb(&s
->gb
);
1937 if(h
->pps
.redundant_pic_cnt_present
){
1938 h
->redundant_pic_count
= get_ue_golomb(&s
->gb
);
1941 //set defaults, might be overridden a few lines later
1942 h
->ref_count
[0]= h
->pps
.ref_count
[0];
1943 h
->ref_count
[1]= h
->pps
.ref_count
[1];
1945 if(h
->slice_type_nos
!= FF_I_TYPE
){
1946 if(h
->slice_type_nos
== FF_B_TYPE
){
1947 h
->direct_spatial_mv_pred
= get_bits1(&s
->gb
);
1949 num_ref_idx_active_override_flag
= get_bits1(&s
->gb
);
1951 if(num_ref_idx_active_override_flag
){
1952 h
->ref_count
[0]= get_ue_golomb(&s
->gb
) + 1;
1953 if(h
->slice_type_nos
==FF_B_TYPE
)
1954 h
->ref_count
[1]= get_ue_golomb(&s
->gb
) + 1;
1956 if(h
->ref_count
[0]-1 > 32-1 || h
->ref_count
[1]-1 > 32-1){
1957 av_log(h
->s
.avctx
, AV_LOG_ERROR
, "reference overflow\n");
1958 h
->ref_count
[0]= h
->ref_count
[1]= 1;
1962 if(h
->slice_type_nos
== FF_B_TYPE
)
1969 if(!default_ref_list_done
){
1970 ff_h264_fill_default_ref_list(h
);
1973 if(h
->slice_type_nos
!=FF_I_TYPE
&& ff_h264_decode_ref_pic_list_reordering(h
) < 0)
1976 if(h
->slice_type_nos
!=FF_I_TYPE
){
1977 s
->last_picture_ptr
= &h
->ref_list
[0][0];
1978 ff_copy_picture(&s
->last_picture
, s
->last_picture_ptr
);
1980 if(h
->slice_type_nos
==FF_B_TYPE
){
1981 s
->next_picture_ptr
= &h
->ref_list
[1][0];
1982 ff_copy_picture(&s
->next_picture
, s
->next_picture_ptr
);
1985 if( (h
->pps
.weighted_pred
&& h
->slice_type_nos
== FF_P_TYPE
)
1986 || (h
->pps
.weighted_bipred_idc
==1 && h
->slice_type_nos
== FF_B_TYPE
) )
1987 pred_weight_table(h
);
1988 else if(h
->pps
.weighted_bipred_idc
==2 && h
->slice_type_nos
== FF_B_TYPE
)
1989 implicit_weight_table(h
);
1992 for (i
= 0; i
< 2; i
++) {
1993 h
->luma_weight_flag
[i
] = 0;
1994 h
->chroma_weight_flag
[i
] = 0;
1999 ff_h264_decode_ref_pic_marking(h0
, &s
->gb
);
2002 ff_h264_fill_mbaff_ref_list(h
);
2004 if(h
->slice_type_nos
==FF_B_TYPE
&& !h
->direct_spatial_mv_pred
)
2005 ff_h264_direct_dist_scale_factor(h
);
2006 ff_h264_direct_ref_list_init(h
);
2008 if( h
->slice_type_nos
!= FF_I_TYPE
&& h
->pps
.cabac
){
2009 tmp
= get_ue_golomb_31(&s
->gb
);
2011 av_log(s
->avctx
, AV_LOG_ERROR
, "cabac_init_idc overflow\n");
2014 h
->cabac_init_idc
= tmp
;
2017 h
->last_qscale_diff
= 0;
2018 tmp
= h
->pps
.init_qp
+ get_se_golomb(&s
->gb
);
2020 av_log(s
->avctx
, AV_LOG_ERROR
, "QP %u out of range\n", tmp
);
2024 h
->chroma_qp
[0] = get_chroma_qp(h
, 0, s
->qscale
);
2025 h
->chroma_qp
[1] = get_chroma_qp(h
, 1, s
->qscale
);
2026 //FIXME qscale / qp ... stuff
2027 if(h
->slice_type
== FF_SP_TYPE
){
2028 get_bits1(&s
->gb
); /* sp_for_switch_flag */
2030 if(h
->slice_type
==FF_SP_TYPE
|| h
->slice_type
== FF_SI_TYPE
){
2031 get_se_golomb(&s
->gb
); /* slice_qs_delta */
2034 h
->deblocking_filter
= 1;
2035 h
->slice_alpha_c0_offset
= 52;
2036 h
->slice_beta_offset
= 52;
2037 if( h
->pps
.deblocking_filter_parameters_present
) {
2038 tmp
= get_ue_golomb_31(&s
->gb
);
2040 av_log(s
->avctx
, AV_LOG_ERROR
, "deblocking_filter_idc %u out of range\n", tmp
);
2043 h
->deblocking_filter
= tmp
;
2044 if(h
->deblocking_filter
< 2)
2045 h
->deblocking_filter
^= 1; // 1<->0
2047 if( h
->deblocking_filter
) {
2048 h
->slice_alpha_c0_offset
+= get_se_golomb(&s
->gb
) << 1;
2049 h
->slice_beta_offset
+= get_se_golomb(&s
->gb
) << 1;
2050 if( h
->slice_alpha_c0_offset
> 104U
2051 || h
->slice_beta_offset
> 104U){
2052 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
);
2058 if( s
->avctx
->skip_loop_filter
>= AVDISCARD_ALL
2059 ||(s
->avctx
->skip_loop_filter
>= AVDISCARD_NONKEY
&& h
->slice_type_nos
!= FF_I_TYPE
)
2060 ||(s
->avctx
->skip_loop_filter
>= AVDISCARD_BIDIR
&& h
->slice_type_nos
== FF_B_TYPE
)
2061 ||(s
->avctx
->skip_loop_filter
>= AVDISCARD_NONREF
&& h
->nal_ref_idc
== 0))
2062 h
->deblocking_filter
= 0;
2064 if(h
->deblocking_filter
== 1 && h0
->max_contexts
> 1) {
2065 if(s
->avctx
->flags2
& CODEC_FLAG2_FAST
) {
2066 /* Cheat slightly for speed:
2067 Do not bother to deblock across slices. */
2068 h
->deblocking_filter
= 2;
2070 h0
->max_contexts
= 1;
2071 if(!h0
->single_decode_warning
) {
2072 av_log(s
->avctx
, AV_LOG_INFO
, "Cannot parallelize deblocking type 1, decoding such frames in sequential order\n");
2073 h0
->single_decode_warning
= 1;
2076 return 1; // deblocking switched inside frame
2079 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]);
2082 if( h
->pps
.num_slice_groups
> 1 && h
->pps
.mb_slice_group_map_type
>= 3 && h
->pps
.mb_slice_group_map_type
<= 5)
2083 slice_group_change_cycle
= get_bits(&s
->gb
, ?
);
2086 h0
->last_slice_type
= slice_type
;
2087 h
->slice_num
= ++h0
->current_slice
;
2088 if(h
->slice_num
>= MAX_SLICES
){
2089 av_log(s
->avctx
, AV_LOG_ERROR
, "Too many slices, increase MAX_SLICES and recompile\n");
2094 int *ref2frm
= h
->ref2frm
[h
->slice_num
&(MAX_SLICES
-1)][j
];
2095 for(i
=0; i
<16; i
++){
2097 if(h
->ref_list
[j
][i
].data
[0]){
2099 uint8_t *base
= h
->ref_list
[j
][i
].base
[0];
2100 for(k
=0; k
<h
->short_ref_count
; k
++)
2101 if(h
->short_ref
[k
]->base
[0] == base
){
2105 for(k
=0; k
<h
->long_ref_count
; k
++)
2106 if(h
->long_ref
[k
] && h
->long_ref
[k
]->base
[0] == base
){
2107 id_list
[i
]= h
->short_ref_count
+ k
;
2116 ref2frm
[i
+2]= 4*id_list
[i
]
2117 +(h
->ref_list
[j
][i
].reference
&3);
2120 for(i
=16; i
<48; i
++)
2121 ref2frm
[i
+4]= 4*id_list
[(i
-16)>>1]
2122 +(h
->ref_list
[j
][i
].reference
&3);
2125 h
->emu_edge_width
= (s
->flags
&CODEC_FLAG_EMU_EDGE
) ?
0 : 16;
2126 h
->emu_edge_height
= (FRAME_MBAFF
|| FIELD_PICTURE
) ?
0 : h
->emu_edge_width
;
2128 s
->avctx
->refs
= h
->sps
.ref_frame_count
;
2130 if(s
->avctx
->debug
&FF_DEBUG_PICT_INFO
){
2131 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",
2133 (s
->picture_structure
==PICT_FRAME ?
"F" : s
->picture_structure
==PICT_TOP_FIELD ?
"T" : "B"),
2135 av_get_pict_type_char(h
->slice_type
), h
->slice_type_fixed ?
" fix" : "", h
->nal_unit_type
== NAL_IDR_SLICE ?
" IDR" : "",
2136 pps_id
, h
->frame_num
,
2137 s
->current_picture_ptr
->field_poc
[0], s
->current_picture_ptr
->field_poc
[1],
2138 h
->ref_count
[0], h
->ref_count
[1],
2140 h
->deblocking_filter
, h
->slice_alpha_c0_offset
/2-26, h
->slice_beta_offset
/2-26,
2142 h
->use_weight
==1 && h
->use_weight_chroma ?
"c" : "",
2143 h
->slice_type
== FF_B_TYPE ?
(h
->direct_spatial_mv_pred ?
"SPAT" : "TEMP") : ""
2150 int ff_h264_get_slice_type(const H264Context
*h
)
2152 switch (h
->slice_type
) {
2153 case FF_P_TYPE
: return 0;
2154 case FF_B_TYPE
: return 1;
2155 case FF_I_TYPE
: return 2;
2156 case FF_SP_TYPE
: return 3;
2157 case FF_SI_TYPE
: return 4;
2162 static void loop_filter(H264Context
*h
){
2163 MpegEncContext
* const s
= &h
->s
;
2164 uint8_t *dest_y
, *dest_cb
, *dest_cr
;
2165 int linesize
, uvlinesize
, mb_x
, mb_y
;
2166 const int end_mb_y
= s
->mb_y
+ FRAME_MBAFF
;
2167 const int old_slice_type
= h
->slice_type
;
2169 if(h
->deblocking_filter
) {
2170 for(mb_x
= 0; mb_x
<s
->mb_width
; mb_x
++){
2171 for(mb_y
=end_mb_y
- FRAME_MBAFF
; mb_y
<= end_mb_y
; mb_y
++){
2172 int list
, mb_xy
, mb_type
;
2173 mb_xy
= h
->mb_xy
= mb_x
+ mb_y
*s
->mb_stride
;
2174 h
->slice_num
= h
->slice_table
[mb_xy
];
2175 mb_type
= s
->current_picture
.mb_type
[mb_xy
];
2176 h
->list_count
= h
->list_counts
[mb_xy
];
2179 h
->mb_mbaff
= h
->mb_field_decoding_flag
= !!IS_INTERLACED(mb_type
);
2183 dest_y
= s
->current_picture
.data
[0] + (mb_x
+ mb_y
* s
->linesize
) * 16;
2184 dest_cb
= s
->current_picture
.data
[1] + (mb_x
+ mb_y
* s
->uvlinesize
) * 8;
2185 dest_cr
= s
->current_picture
.data
[2] + (mb_x
+ mb_y
* s
->uvlinesize
) * 8;
2186 //FIXME simplify above
2189 linesize
= h
->mb_linesize
= s
->linesize
* 2;
2190 uvlinesize
= h
->mb_uvlinesize
= s
->uvlinesize
* 2;
2191 if(mb_y
&1){ //FIXME move out of this function?
2192 dest_y
-= s
->linesize
*15;
2193 dest_cb
-= s
->uvlinesize
*7;
2194 dest_cr
-= s
->uvlinesize
*7;
2197 linesize
= h
->mb_linesize
= s
->linesize
;
2198 uvlinesize
= h
->mb_uvlinesize
= s
->uvlinesize
;
2200 backup_mb_border(h
, dest_y
, dest_cb
, dest_cr
, linesize
, uvlinesize
, 0);
2201 if(fill_filter_caches(h
, mb_type
))
2203 h
->chroma_qp
[0] = get_chroma_qp(h
, 0, s
->current_picture
.qscale_table
[mb_xy
]);
2204 h
->chroma_qp
[1] = get_chroma_qp(h
, 1, s
->current_picture
.qscale_table
[mb_xy
]);
2207 ff_h264_filter_mb (h
, mb_x
, mb_y
, dest_y
, dest_cb
, dest_cr
, linesize
, uvlinesize
);
2209 ff_h264_filter_mb_fast(h
, mb_x
, mb_y
, dest_y
, dest_cb
, dest_cr
, linesize
, uvlinesize
);
2214 h
->slice_type
= old_slice_type
;
2216 s
->mb_y
= end_mb_y
- FRAME_MBAFF
;
2219 static int decode_slice(struct AVCodecContext
*avctx
, void *arg
){
2220 H264Context
*h
= *(void**)arg
;
2221 MpegEncContext
* const s
= &h
->s
;
2222 const int part_mask
= s
->partitioned_frame ?
(AC_END
|AC_ERROR
) : 0x7F;
2226 h
->is_complex
= FRAME_MBAFF
|| s
->picture_structure
!= PICT_FRAME
|| s
->codec_id
!= CODEC_ID_H264
||
2227 (CONFIG_GRAY
&& (s
->flags
&CODEC_FLAG_GRAY
));
2229 if( h
->pps
.cabac
) {
2231 align_get_bits( &s
->gb
);
2234 ff_init_cabac_states( &h
->cabac
);
2235 ff_init_cabac_decoder( &h
->cabac
,
2236 s
->gb
.buffer
+ get_bits_count(&s
->gb
)/8,
2237 (get_bits_left(&s
->gb
) + 7)/8);
2239 ff_h264_init_cabac_states(h
);
2243 int ret
= ff_h264_decode_mb_cabac(h
);
2245 //STOP_TIMER("decode_mb_cabac")
2247 if(ret
>=0) ff_h264_hl_decode_mb(h
);
2249 if( ret
>= 0 && FRAME_MBAFF
) { //FIXME optimal? or let mb_decode decode 16x32 ?
2252 ret
= ff_h264_decode_mb_cabac(h
);
2254 if(ret
>=0) ff_h264_hl_decode_mb(h
);
2257 eos
= get_cabac_terminate( &h
->cabac
);
2259 if( ret
< 0 || h
->cabac
.bytestream
> h
->cabac
.bytestream_end
+ 2) {
2260 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
);
2261 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
);
2265 if( ++s
->mb_x
>= s
->mb_width
) {
2268 ff_draw_horiz_band(s
, 16*s
->mb_y
, 16);
2270 if(FIELD_OR_MBAFF_PICTURE
) {
2275 if( eos
|| s
->mb_y
>= s
->mb_height
) {
2276 tprintf(s
->avctx
, "slice end %d %d\n", get_bits_count(&s
->gb
), s
->gb
.size_in_bits
);
2277 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
);
2284 int ret
= ff_h264_decode_mb_cavlc(h
);
2286 if(ret
>=0) ff_h264_hl_decode_mb(h
);
2288 if(ret
>=0 && FRAME_MBAFF
){ //FIXME optimal? or let mb_decode decode 16x32 ?
2290 ret
= ff_h264_decode_mb_cavlc(h
);
2292 if(ret
>=0) ff_h264_hl_decode_mb(h
);
2297 av_log(h
->s
.avctx
, AV_LOG_ERROR
, "error while decoding MB %d %d\n", s
->mb_x
, s
->mb_y
);
2298 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
);
2303 if(++s
->mb_x
>= s
->mb_width
){
2306 ff_draw_horiz_band(s
, 16*s
->mb_y
, 16);
2308 if(FIELD_OR_MBAFF_PICTURE
) {
2311 if(s
->mb_y
>= s
->mb_height
){
2312 tprintf(s
->avctx
, "slice end %d %d\n", get_bits_count(&s
->gb
), s
->gb
.size_in_bits
);
2314 if(get_bits_count(&s
->gb
) == s
->gb
.size_in_bits
) {
2315 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
);
2319 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
);
2326 if(get_bits_count(&s
->gb
) >= s
->gb
.size_in_bits
&& s
->mb_skip_run
<=0){
2327 tprintf(s
->avctx
, "slice end %d %d\n", get_bits_count(&s
->gb
), s
->gb
.size_in_bits
);
2328 if(get_bits_count(&s
->gb
) == s
->gb
.size_in_bits
){
2329 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
);
2333 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
);
2342 for(;s
->mb_y
< s
->mb_height
; s
->mb_y
++){
2343 for(;s
->mb_x
< s
->mb_width
; s
->mb_x
++){
2344 int ret
= decode_mb(h
);
2346 ff_h264_hl_decode_mb(h
);
2349 av_log(s
->avctx
, AV_LOG_ERROR
, "error while decoding MB %d %d\n", s
->mb_x
, s
->mb_y
);
2350 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
);
2355 if(++s
->mb_x
>= s
->mb_width
){
2357 if(++s
->mb_y
>= s
->mb_height
){
2358 if(get_bits_count(s
->gb
) == s
->gb
.size_in_bits
){
2359 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
);
2363 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
);
2370 if(get_bits_count(s
->?gb
) >= s
->gb?
.size_in_bits
){
2371 if(get_bits_count(s
->gb
) == s
->gb
.size_in_bits
){
2372 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
);
2376 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
);
2383 ff_draw_horiz_band(s
, 16*s
->mb_y
, 16);
2386 return -1; //not reached
2390 * Call decode_slice() for each context.
2392 * @param h h264 master context
2393 * @param context_count number of contexts to execute
2395 static void execute_decode_slices(H264Context
*h
, int context_count
){
2396 MpegEncContext
* const s
= &h
->s
;
2397 AVCodecContext
* const avctx
= s
->avctx
;
2401 if (s
->avctx
->hwaccel
)
2403 if(s
->avctx
->codec
->capabilities
&CODEC_CAP_HWACCEL_VDPAU
)
2405 if(context_count
== 1) {
2406 decode_slice(avctx
, &h
);
2408 for(i
= 1; i
< context_count
; i
++) {
2409 hx
= h
->thread_context
[i
];
2410 hx
->s
.error_recognition
= avctx
->error_recognition
;
2411 hx
->s
.error_count
= 0;
2414 avctx
->execute(avctx
, (void *)decode_slice
,
2415 h
->thread_context
, NULL
, context_count
, sizeof(void*));
2417 /* pull back stuff from slices to master context */
2418 hx
= h
->thread_context
[context_count
- 1];
2419 s
->mb_x
= hx
->s
.mb_x
;
2420 s
->mb_y
= hx
->s
.mb_y
;
2421 s
->dropable
= hx
->s
.dropable
;
2422 s
->picture_structure
= hx
->s
.picture_structure
;
2423 for(i
= 1; i
< context_count
; i
++)
2424 h
->s
.error_count
+= h
->thread_context
[i
]->s
.error_count
;
2429 static int decode_nal_units(H264Context
*h
, const uint8_t *buf
, int buf_size
){
2430 MpegEncContext
* const s
= &h
->s
;
2431 AVCodecContext
* const avctx
= s
->avctx
;
2433 H264Context
*hx
; ///< thread context
2434 int context_count
= 0;
2435 int next_avc
= h
->is_avc ?
0 : buf_size
;
2437 h
->max_contexts
= avctx
->thread_count
;
2440 for(i
=0; i
<50; i
++){
2441 av_log(NULL
, AV_LOG_ERROR
,"%02X ", buf
[i
]);
2444 if(!(s
->flags2
& CODEC_FLAG2_CHUNKS
)){
2445 h
->current_slice
= 0;
2446 if (!s
->first_field
)
2447 s
->current_picture_ptr
= NULL
;
2448 ff_h264_reset_sei(h
);
2459 if(buf_index
>= next_avc
) {
2460 if(buf_index
>= buf_size
) break;
2462 for(i
= 0; i
< h
->nal_length_size
; i
++)
2463 nalsize
= (nalsize
<< 8) | buf
[buf_index
++];
2464 if(nalsize
<= 1 || nalsize
> buf_size
- buf_index
){
2469 av_log(h
->s
.avctx
, AV_LOG_ERROR
, "AVC: nal size %d\n", nalsize
);
2473 next_avc
= buf_index
+ nalsize
;
2475 // start code prefix search
2476 for(; buf_index
+ 3 < next_avc
; buf_index
++){
2477 // This should always succeed in the first iteration.
2478 if(buf
[buf_index
] == 0 && buf
[buf_index
+1] == 0 && buf
[buf_index
+2] == 1)
2482 if(buf_index
+3 >= buf_size
) break;
2485 if(buf_index
>= next_avc
) continue;
2488 hx
= h
->thread_context
[context_count
];
2490 ptr
= ff_h264_decode_nal(hx
, buf
+ buf_index
, &dst_length
, &consumed
, next_avc
- buf_index
);
2491 if (ptr
==NULL
|| dst_length
< 0){
2494 while(ptr
[dst_length
- 1] == 0 && dst_length
> 0)
2496 bit_length
= !dst_length ?
0 : (8*dst_length
- ff_h264_decode_rbsp_trailing(h
, ptr
+ dst_length
- 1));
2498 if(s
->avctx
->debug
&FF_DEBUG_STARTCODE
){
2499 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
);
2502 if (h
->is_avc
&& (nalsize
!= consumed
) && nalsize
){
2503 av_log(h
->s
.avctx
, AV_LOG_DEBUG
, "AVC: Consumed only %d bytes instead of %d\n", consumed
, nalsize
);
2506 buf_index
+= consumed
;
2508 if( (s
->hurry_up
== 1 && h
->nal_ref_idc
== 0) //FIXME do not discard SEI id
2509 ||(avctx
->skip_frame
>= AVDISCARD_NONREF
&& h
->nal_ref_idc
== 0))
2514 switch(hx
->nal_unit_type
){
2516 if (h
->nal_unit_type
!= NAL_IDR_SLICE
) {
2517 av_log(h
->s
.avctx
, AV_LOG_ERROR
, "Invalid mix of idr and non-idr slices");
2520 idr(h
); //FIXME ensure we don't loose some frames if there is reordering
2522 init_get_bits(&hx
->s
.gb
, ptr
, bit_length
);
2524 hx
->inter_gb_ptr
= &hx
->s
.gb
;
2525 hx
->s
.data_partitioning
= 0;
2527 if((err
= decode_slice_header(hx
, h
)))
2530 if (s
->avctx
->hwaccel
&& h
->current_slice
== 1) {
2531 if (s
->avctx
->hwaccel
->start_frame(s
->avctx
, NULL
, 0) < 0)
2535 s
->current_picture_ptr
->key_frame
|=
2536 (hx
->nal_unit_type
== NAL_IDR_SLICE
) ||
2537 (h
->sei_recovery_frame_cnt
>= 0);
2538 if(hx
->redundant_pic_count
==0 && hx
->s
.hurry_up
< 5
2539 && (avctx
->skip_frame
< AVDISCARD_NONREF
|| hx
->nal_ref_idc
)
2540 && (avctx
->skip_frame
< AVDISCARD_BIDIR
|| hx
->slice_type_nos
!=FF_B_TYPE
)
2541 && (avctx
->skip_frame
< AVDISCARD_NONKEY
|| hx
->slice_type_nos
==FF_I_TYPE
)
2542 && avctx
->skip_frame
< AVDISCARD_ALL
){
2543 if(avctx
->hwaccel
) {
2544 if (avctx
->hwaccel
->decode_slice(avctx
, &buf
[buf_index
- consumed
], consumed
) < 0)
2547 if(CONFIG_H264_VDPAU_DECODER
&& s
->avctx
->codec
->capabilities
&CODEC_CAP_HWACCEL_VDPAU
){
2548 static const uint8_t start_code
[] = {0x00, 0x00, 0x01};
2549 ff_vdpau_add_data_chunk(s
, start_code
, sizeof(start_code
));
2550 ff_vdpau_add_data_chunk(s
, &buf
[buf_index
- consumed
], consumed
);
2556 init_get_bits(&hx
->s
.gb
, ptr
, bit_length
);
2558 hx
->inter_gb_ptr
= NULL
;
2560 if ((err
= decode_slice_header(hx
, h
)) < 0)
2563 hx
->s
.data_partitioning
= 1;
2567 init_get_bits(&hx
->intra_gb
, ptr
, bit_length
);
2568 hx
->intra_gb_ptr
= &hx
->intra_gb
;
2571 init_get_bits(&hx
->inter_gb
, ptr
, bit_length
);
2572 hx
->inter_gb_ptr
= &hx
->inter_gb
;
2574 if(hx
->redundant_pic_count
==0 && hx
->intra_gb_ptr
&& hx
->s
.data_partitioning
2575 && s
->context_initialized
2577 && (avctx
->skip_frame
< AVDISCARD_NONREF
|| hx
->nal_ref_idc
)
2578 && (avctx
->skip_frame
< AVDISCARD_BIDIR
|| hx
->slice_type_nos
!=FF_B_TYPE
)
2579 && (avctx
->skip_frame
< AVDISCARD_NONKEY
|| hx
->slice_type_nos
==FF_I_TYPE
)
2580 && avctx
->skip_frame
< AVDISCARD_ALL
)
2584 init_get_bits(&s
->gb
, ptr
, bit_length
);
2585 ff_h264_decode_sei(h
);
2588 init_get_bits(&s
->gb
, ptr
, bit_length
);
2589 ff_h264_decode_seq_parameter_set(h
);
2591 if(s
->flags
& CODEC_FLAG_LOW_DELAY
)
2594 if(avctx
->has_b_frames
< 2)
2595 avctx
->has_b_frames
= !s
->low_delay
;
2598 init_get_bits(&s
->gb
, ptr
, bit_length
);
2600 ff_h264_decode_picture_parameter_set(h
, bit_length
);
2604 case NAL_END_SEQUENCE
:
2605 case NAL_END_STREAM
:
2606 case NAL_FILLER_DATA
:
2608 case NAL_AUXILIARY_SLICE
:
2611 av_log(avctx
, AV_LOG_DEBUG
, "Unknown NAL code: %d (%d bits)\n", hx
->nal_unit_type
, bit_length
);
2614 if(context_count
== h
->max_contexts
) {
2615 execute_decode_slices(h
, context_count
);
2620 av_log(h
->s
.avctx
, AV_LOG_ERROR
, "decode_slice_header error\n");
2622 /* Slice could not be decoded in parallel mode, copy down
2623 * NAL unit stuff to context 0 and restart. Note that
2624 * rbsp_buffer is not transferred, but since we no longer
2625 * run in parallel mode this should not be an issue. */
2626 h
->nal_unit_type
= hx
->nal_unit_type
;
2627 h
->nal_ref_idc
= hx
->nal_ref_idc
;
2633 execute_decode_slices(h
, context_count
);
2638 * returns the number of bytes consumed for building the current frame
2640 static int get_consumed_bytes(MpegEncContext
*s
, int pos
, int buf_size
){
2641 if(pos
==0) pos
=1; //avoid infinite loops (i doubt that is needed but ...)
2642 if(pos
+10>buf_size
) pos
=buf_size
; // oops ;)
2647 static int decode_frame(AVCodecContext
*avctx
,
2648 void *data
, int *data_size
,
2651 const uint8_t *buf
= avpkt
->data
;
2652 int buf_size
= avpkt
->size
;
2653 H264Context
*h
= avctx
->priv_data
;
2654 MpegEncContext
*s
= &h
->s
;
2655 AVFrame
*pict
= data
;
2658 s
->flags
= avctx
->flags
;
2659 s
->flags2
= avctx
->flags2
;
2661 /* end of stream, output what is still in the buffers */
2662 if (buf_size
== 0) {
2666 //FIXME factorize this with the output code below
2667 out
= h
->delayed_pic
[0];
2669 for(i
=1; h
->delayed_pic
[i
] && !h
->delayed_pic
[i
]->key_frame
&& !h
->delayed_pic
[i
]->mmco_reset
; i
++)
2670 if(h
->delayed_pic
[i
]->poc
< out
->poc
){
2671 out
= h
->delayed_pic
[i
];
2675 for(i
=out_idx
; h
->delayed_pic
[i
]; i
++)
2676 h
->delayed_pic
[i
] = h
->delayed_pic
[i
+1];
2679 *data_size
= sizeof(AVFrame
);
2680 *pict
= *(AVFrame
*)out
;
2686 if(h
->is_avc
&& !h
->got_avcC
) {
2687 int i
, cnt
, nalsize
;
2688 unsigned char *p
= avctx
->extradata
;
2689 if(avctx
->extradata_size
< 7) {
2690 av_log(avctx
, AV_LOG_ERROR
, "avcC too short\n");
2694 av_log(avctx
, AV_LOG_ERROR
, "Unknown avcC version %d\n", *p
);
2697 /* sps and pps in the avcC always have length coded with 2 bytes,
2698 so put a fake nal_length_size = 2 while parsing them */
2699 h
->nal_length_size
= 2;
2700 // Decode sps from avcC
2701 cnt
= *(p
+5) & 0x1f; // Number of sps
2703 for (i
= 0; i
< cnt
; i
++) {
2704 nalsize
= AV_RB16(p
) + 2;
2705 if(decode_nal_units(h
, p
, nalsize
) < 0) {
2706 av_log(avctx
, AV_LOG_ERROR
, "Decoding sps %d from avcC failed\n", i
);
2711 // Decode pps from avcC
2712 cnt
= *(p
++); // Number of pps
2713 for (i
= 0; i
< cnt
; i
++) {
2714 nalsize
= AV_RB16(p
) + 2;
2715 if(decode_nal_units(h
, p
, nalsize
) != nalsize
) {
2716 av_log(avctx
, AV_LOG_ERROR
, "Decoding pps %d from avcC failed\n", i
);
2721 // Now store right nal length size, that will be use to parse all other nals
2722 h
->nal_length_size
= ((*(((char*)(avctx
->extradata
))+4))&0x03)+1;
2723 // Do not reparse avcC
2727 if(!h
->got_avcC
&& !h
->is_avc
&& s
->avctx
->extradata_size
){
2728 if(decode_nal_units(h
, s
->avctx
->extradata
, s
->avctx
->extradata_size
) < 0)
2733 buf_index
=decode_nal_units(h
, buf
, buf_size
);
2737 if(!(s
->flags2
& CODEC_FLAG2_CHUNKS
) && !s
->current_picture_ptr
){
2738 if (avctx
->skip_frame
>= AVDISCARD_NONREF
|| s
->hurry_up
) return 0;
2739 av_log(avctx
, AV_LOG_ERROR
, "no frame!\n");
2743 if(!(s
->flags2
& CODEC_FLAG2_CHUNKS
) || (s
->mb_y
>= s
->mb_height
&& s
->mb_height
)){
2744 Picture
*out
= s
->current_picture_ptr
;
2745 Picture
*cur
= s
->current_picture_ptr
;
2746 int i
, pics
, out_of_order
, out_idx
;
2750 if (cur
->field_poc
[0]==INT_MAX
|| cur
->field_poc
[1]==INT_MAX
) {
2751 /* Wait for second field. */
2755 cur
->interlaced_frame
= 0;
2756 cur
->repeat_pict
= 0;
2758 /* Signal interlacing information externally. */
2759 /* Prioritize picture timing SEI information over used decoding process if it exists. */
2761 if(h
->sps
.pic_struct_present_flag
){
2762 switch (h
->sei_pic_struct
)
2764 case SEI_PIC_STRUCT_FRAME
:
2766 case SEI_PIC_STRUCT_TOP_FIELD
:
2767 case SEI_PIC_STRUCT_BOTTOM_FIELD
:
2768 cur
->interlaced_frame
= 1;
2770 case SEI_PIC_STRUCT_TOP_BOTTOM
:
2771 case SEI_PIC_STRUCT_BOTTOM_TOP
:
2772 if (FIELD_OR_MBAFF_PICTURE
)
2773 cur
->interlaced_frame
= 1;
2775 // try to flag soft telecine progressive
2776 cur
->interlaced_frame
= h
->prev_interlaced_frame
;
2778 case SEI_PIC_STRUCT_TOP_BOTTOM_TOP
:
2779 case SEI_PIC_STRUCT_BOTTOM_TOP_BOTTOM
:
2780 // Signal the possibility of telecined film externally (pic_struct 5,6)
2781 // From these hints, let the applications decide if they apply deinterlacing.
2782 cur
->repeat_pict
= 1;