Index: patched-ffmpeg-mt/libavcodec/h264.c |
=================================================================== |
--- patched-ffmpeg-mt/libavcodec/h264.c (revision 41250) |
+++ patched-ffmpeg-mt/libavcodec/h264.c (working copy) |
@@ -53,15 +53,12 @@ |
}; |
void ff_h264_write_back_intra_pred_mode(H264Context *h){ |
- const int mb_xy= h->mb_xy; |
+ int8_t *mode= h->intra4x4_pred_mode + h->mb2br_xy[h->mb_xy]; |
- h->intra4x4_pred_mode[mb_xy][0]= h->intra4x4_pred_mode_cache[7+8*1]; |
- h->intra4x4_pred_mode[mb_xy][1]= h->intra4x4_pred_mode_cache[7+8*2]; |
- h->intra4x4_pred_mode[mb_xy][2]= h->intra4x4_pred_mode_cache[7+8*3]; |
- h->intra4x4_pred_mode[mb_xy][3]= h->intra4x4_pred_mode_cache[7+8*4]; |
- h->intra4x4_pred_mode[mb_xy][4]= h->intra4x4_pred_mode_cache[4+8*4]; |
- h->intra4x4_pred_mode[mb_xy][5]= h->intra4x4_pred_mode_cache[5+8*4]; |
- h->intra4x4_pred_mode[mb_xy][6]= h->intra4x4_pred_mode_cache[6+8*4]; |
+ AV_COPY32(mode, h->intra4x4_pred_mode_cache + 4 + 8*4); |
+ mode[4]= h->intra4x4_pred_mode_cache[7+8*3]; |
+ mode[5]= h->intra4x4_pred_mode_cache[7+8*2]; |
+ mode[6]= h->intra4x4_pred_mode_cache[7+8*1]; |
} |
/** |
@@ -157,11 +154,11 @@ |
# if HAVE_FAST_64BIT |
# define RS 7 |
for(i=0; i+1<length; i+=9){ |
- if(!((~*(const uint64_t*)(src+i) & (*(const uint64_t*)(src+i) - 0x0100010001000101ULL)) & 0x8000800080008080ULL)) |
+ if(!((~AV_RN64A(src+i) & (AV_RN64A(src+i) - 0x0100010001000101ULL)) & 0x8000800080008080ULL)) |
# else |
# define RS 3 |
for(i=0; i+1<length; i+=5){ |
- if(!((~*(const uint32_t*)(src+i) & (*(const uint32_t*)(src+i) - 0x01000101U)) & 0x80008080U)) |
+ if(!((~AV_RN32A(src+i) & (AV_RN32A(src+i) - 0x01000101U)) & 0x80008080U)) |
# endif |
continue; |
if(i>0 && !src[i]) i--; |
@@ -630,14 +627,14 @@ |
chroma_weight_avg(dest_cr, tmp_cr, h->mb_uvlinesize, 5, weight0, weight1, 0); |
}else{ |
luma_weight_avg(dest_y, tmp_y, h->mb_linesize, h->luma_log2_weight_denom, |
- h->luma_weight[0][refn0], h->luma_weight[1][refn1], |
- h->luma_offset[0][refn0] + h->luma_offset[1][refn1]); |
+ h->luma_weight[refn0][0][0] , h->luma_weight[refn1][1][0], |
+ h->luma_weight[refn0][0][1] + h->luma_weight[refn1][1][1]); |
chroma_weight_avg(dest_cb, tmp_cb, h->mb_uvlinesize, h->chroma_log2_weight_denom, |
- h->chroma_weight[0][refn0][0], h->chroma_weight[1][refn1][0], |
- h->chroma_offset[0][refn0][0] + h->chroma_offset[1][refn1][0]); |
+ h->chroma_weight[refn0][0][0][0] , h->chroma_weight[refn1][1][0][0], |
+ h->chroma_weight[refn0][0][0][1] + h->chroma_weight[refn1][1][0][1]); |
chroma_weight_avg(dest_cr, tmp_cr, h->mb_uvlinesize, h->chroma_log2_weight_denom, |
- h->chroma_weight[0][refn0][1], h->chroma_weight[1][refn1][1], |
- h->chroma_offset[0][refn0][1] + h->chroma_offset[1][refn1][1]); |
+ h->chroma_weight[refn0][0][1][0] , h->chroma_weight[refn1][1][1][0], |
+ h->chroma_weight[refn0][0][1][1] + h->chroma_weight[refn1][1][1][1]); |
} |
}else{ |
int list = list1 ? 1 : 0; |
@@ -648,12 +645,12 @@ |
qpix_put, chroma_put); |
luma_weight_op(dest_y, h->mb_linesize, h->luma_log2_weight_denom, |
- h->luma_weight[list][refn], h->luma_offset[list][refn]); |
+ h->luma_weight[refn][list][0], h->luma_weight[refn][list][1]); |
if(h->use_weight_chroma){ |
chroma_weight_op(dest_cb, h->mb_uvlinesize, h->chroma_log2_weight_denom, |
- h->chroma_weight[list][refn][0], h->chroma_offset[list][refn][0]); |
+ h->chroma_weight[refn][list][0][0], h->chroma_weight[refn][list][0][1]); |
chroma_weight_op(dest_cr, h->mb_uvlinesize, h->chroma_log2_weight_denom, |
- h->chroma_weight[list][refn][1], h->chroma_offset[list][refn][1]); |
+ h->chroma_weight[refn][list][1][0], h->chroma_weight[refn][list][1][1]); |
} |
} |
} |
@@ -797,7 +794,7 @@ |
av_freep(&h->list_counts); |
av_freep(&h->mb2b_xy); |
- av_freep(&h->mb2b8_xy); |
+ av_freep(&h->mb2br_xy); |
for(i = 0; i < MAX_THREADS; i++) { |
hx = h->thread_context[i]; |
@@ -881,33 +878,33 @@ |
int ff_h264_alloc_tables(H264Context *h){ |
MpegEncContext * const s = &h->s; |
const int big_mb_num= s->mb_stride * (s->mb_height+1); |
+ const int row_mb_num= 2*s->mb_stride*s->avctx->thread_count; |
int x,y; |
- FF_ALLOCZ_OR_GOTO(h->s.avctx, h->intra4x4_pred_mode, big_mb_num * 8 * sizeof(uint8_t), fail) |
+ FF_ALLOCZ_OR_GOTO(h->s.avctx, h->intra4x4_pred_mode, row_mb_num * 8 * sizeof(uint8_t), fail) |
FF_ALLOCZ_OR_GOTO(h->s.avctx, h->non_zero_count , big_mb_num * 32 * sizeof(uint8_t), fail) |
FF_ALLOCZ_OR_GOTO(h->s.avctx, h->slice_table_base , (big_mb_num+s->mb_stride) * sizeof(*h->slice_table_base), fail) |
FF_ALLOCZ_OR_GOTO(h->s.avctx, h->cbp_table, big_mb_num * sizeof(uint16_t), fail) |
FF_ALLOCZ_OR_GOTO(h->s.avctx, h->chroma_pred_mode_table, big_mb_num * sizeof(uint8_t), fail) |
- FF_ALLOCZ_OR_GOTO(h->s.avctx, h->mvd_table[0], 32*big_mb_num * sizeof(uint16_t), fail); |
- FF_ALLOCZ_OR_GOTO(h->s.avctx, h->mvd_table[1], 32*big_mb_num * sizeof(uint16_t), fail); |
- FF_ALLOCZ_OR_GOTO(h->s.avctx, h->direct_table, 32*big_mb_num * sizeof(uint8_t) , fail); |
+ FF_ALLOCZ_OR_GOTO(h->s.avctx, h->mvd_table[0], 16*row_mb_num * sizeof(uint8_t), fail); |
+ FF_ALLOCZ_OR_GOTO(h->s.avctx, h->mvd_table[1], 16*row_mb_num * sizeof(uint8_t), fail); |
+ FF_ALLOCZ_OR_GOTO(h->s.avctx, h->direct_table, 4*big_mb_num * sizeof(uint8_t) , fail); |
FF_ALLOCZ_OR_GOTO(h->s.avctx, h->list_counts, big_mb_num * sizeof(uint8_t), fail) |
memset(h->slice_table_base, -1, (big_mb_num+s->mb_stride) * sizeof(*h->slice_table_base)); |
h->slice_table= h->slice_table_base + s->mb_stride*2 + 1; |
FF_ALLOCZ_OR_GOTO(h->s.avctx, h->mb2b_xy , big_mb_num * sizeof(uint32_t), fail); |
- FF_ALLOCZ_OR_GOTO(h->s.avctx, h->mb2b8_xy , big_mb_num * sizeof(uint32_t), fail); |
+ FF_ALLOCZ_OR_GOTO(h->s.avctx, h->mb2br_xy , big_mb_num * sizeof(uint32_t), fail); |
for(y=0; y<s->mb_height; y++){ |
for(x=0; x<s->mb_width; x++){ |
const int mb_xy= x + y*s->mb_stride; |
const int b_xy = 4*x + 4*y*h->b_stride; |
- const int b8_xy= 2*x + 2*y*h->b8_stride; |
h->mb2b_xy [mb_xy]= b_xy; |
- h->mb2b8_xy[mb_xy]= b8_xy; |
+ h->mb2br_xy[mb_xy]= 8*(FMO ? mb_xy : (mb_xy % (2*s->mb_stride))); |
} |
} |
@@ -925,16 +922,17 @@ |
/** |
* Mimic alloc_tables(), but for every context thread. |
*/ |
-static void clone_tables(H264Context *dst, H264Context *src){ |
- dst->intra4x4_pred_mode = src->intra4x4_pred_mode; |
+static void clone_tables(H264Context *dst, H264Context *src, int i){ |
+ MpegEncContext * const s = &src->s; |
+ dst->intra4x4_pred_mode = src->intra4x4_pred_mode + i*8*2*s->mb_stride; |
dst->non_zero_count = src->non_zero_count; |
dst->slice_table = src->slice_table; |
dst->cbp_table = src->cbp_table; |
dst->mb2b_xy = src->mb2b_xy; |
- dst->mb2b8_xy = src->mb2b8_xy; |
+ dst->mb2br_xy = src->mb2br_xy; |
dst->chroma_pred_mode_table = src->chroma_pred_mode_table; |
- dst->mvd_table[0] = src->mvd_table[0]; |
- dst->mvd_table[1] = src->mvd_table[1]; |
+ dst->mvd_table[0] = src->mvd_table[0] + i*8*2*s->mb_stride; |
+ dst->mvd_table[1] = src->mvd_table[1] + i*8*2*s->mb_stride; |
dst->direct_table = src->direct_table; |
dst->list_counts = src->list_counts; |
@@ -950,11 +948,16 @@ |
FF_ALLOCZ_OR_GOTO(h->s.avctx, h->top_borders[0], h->s.mb_width * (16+8+8) * sizeof(uint8_t), fail) |
FF_ALLOCZ_OR_GOTO(h->s.avctx, h->top_borders[1], h->s.mb_width * (16+8+8) * sizeof(uint8_t), fail) |
+ h->ref_cache[0][scan8[5 ]+1] = h->ref_cache[0][scan8[7 ]+1] = h->ref_cache[0][scan8[13]+1] = |
+ h->ref_cache[1][scan8[5 ]+1] = h->ref_cache[1][scan8[7 ]+1] = h->ref_cache[1][scan8[13]+1] = PART_NOT_AVAILABLE; |
+ |
return 0; |
fail: |
return -1; // free_tables will clean up for us |
} |
+static int decode_nal_units(H264Context *h, const uint8_t *buf, int buf_size); |
+ |
static av_cold void common_init(H264Context *h){ |
MpegEncContext * const s = &h->s; |
@@ -996,17 +999,10 @@ |
ff_h264_decode_init_vlc(); |
- if(avctx->extradata_size > 0 && avctx->extradata && |
- *(char *)avctx->extradata == 1){ |
- h->is_avc = 1; |
- h->got_avcC = 0; |
- } else { |
- h->is_avc = 0; |
- } |
- |
h->thread_context[0] = h; |
h->outputed_poc = INT_MIN; |
h->prev_poc_msb= 1<<16; |
+ h->x264_build = -1; |
ff_h264_reset_sei(h); |
if(avctx->codec_id == CODEC_ID_H264){ |
if(avctx->ticks_per_frame == 1){ |
@@ -1014,6 +1010,53 @@ |
} |
avctx->ticks_per_frame = 2; |
} |
+ |
+ if(avctx->extradata_size > 0 && avctx->extradata && *(char *)avctx->extradata == 1){ |
+ int i, cnt, nalsize; |
+ unsigned char *p = avctx->extradata; |
+ |
+ h->is_avc = 1; |
+ |
+ if(avctx->extradata_size < 7) { |
+ av_log(avctx, AV_LOG_ERROR, "avcC too short\n"); |
+ return -1; |
+ } |
+ /* sps and pps in the avcC always have length coded with 2 bytes, |
+ so put a fake nal_length_size = 2 while parsing them */ |
+ h->nal_length_size = 2; |
+ // Decode sps from avcC |
+ cnt = *(p+5) & 0x1f; // Number of sps |
+ p += 6; |
+ for (i = 0; i < cnt; i++) { |
+ nalsize = AV_RB16(p) + 2; |
+ if(decode_nal_units(h, p, nalsize) < 0) { |
+ av_log(avctx, AV_LOG_ERROR, "Decoding sps %d from avcC failed\n", i); |
+ return -1; |
+ } |
+ p += nalsize; |
+ } |
+ // Decode pps from avcC |
+ cnt = *(p++); // Number of pps |
+ for (i = 0; i < cnt; i++) { |
+ nalsize = AV_RB16(p) + 2; |
+ if(decode_nal_units(h, p, nalsize) != nalsize) { |
+ av_log(avctx, AV_LOG_ERROR, "Decoding pps %d from avcC failed\n", i); |
+ return -1; |
+ } |
+ p += nalsize; |
+ } |
+ // Now store right nal length size, that will be use to parse all other nals |
+ h->nal_length_size = ((*(((char*)(avctx->extradata))+4))&0x03)+1; |
+ } else { |
+ h->is_avc = 0; |
+ if(decode_nal_units(h, s->avctx->extradata, s->avctx->extradata_size) < 0) |
+ return -1; |
+ } |
+ if(h->sps.bitstream_restriction_flag && s->avctx->has_b_frames < h->sps.num_reorder_frames){ |
+ s->avctx->has_b_frames = h->sps.num_reorder_frames; |
+ s->low_delay = 0; |
+ } |
+ |
return 0; |
} |
@@ -1072,7 +1115,6 @@ |
//extradata/NAL handling |
h->is_avc = h1->is_avc; |
- h->got_avcC = h1->got_avcC; |
//SPS/PPS |
copy_parameter_set((void**)h->sps_buffers, (void**)h1->sps_buffers, MAX_SPS_COUNT, sizeof(SPS)); |
@@ -1093,10 +1135,11 @@ |
h->dequant_coeff_pps = h1->dequant_coeff_pps; |
//POC timing |
- copy_fields(h, h1, poc_lsb, use_weight); |
+ copy_fields(h, h1, poc_lsb, redundant_pic_count); |
//reference lists |
copy_fields(h, h1, ref_count, intra_gb); |
+ copy_fields(h, h1, short_ref, cabac_init_idc); |
copy_picture_range(h->short_ref, h1->short_ref, 32, s, s1); |
copy_picture_range(h->long_ref, h1->long_ref, 32, s, s1); |
@@ -1366,11 +1409,8 @@ |
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){ |
MpegEncContext * const s = &h->s; |
- int temp8, i; |
- uint64_t temp64; |
int deblock_left; |
int deblock_top; |
- int mb_xy; |
int top_idx = 1; |
uint8_t *top_border_m1; |
uint8_t *top_border; |
@@ -1385,9 +1425,8 @@ |
} |
if(h->deblocking_filter == 2) { |
- mb_xy = h->mb_xy; |
- deblock_left = h->slice_table[mb_xy] == h->slice_table[mb_xy - 1]; |
- deblock_top = h->slice_table[mb_xy] == h->slice_table[h->top_mb_xy]; |
+ deblock_left = h->left_type[0]; |
+ deblock_top = h->top_type; |
} else { |
deblock_left = (s->mb_x > 0); |
deblock_top = (s->mb_y > !!MB_FIELD); |
@@ -1670,18 +1709,6 @@ |
} |
if(h->cbp || IS_INTRA(mb_type)) |
s->dsp.clear_blocks(h->mb); |
- |
- if(h->deblocking_filter && 0) { |
- backup_mb_border(h, dest_y, dest_cb, dest_cr, linesize, uvlinesize, simple); |
- fill_filter_caches(h, mb_type); //FIXME don't fill stuff which isn't used by filter_mb |
- h->chroma_qp[0] = get_chroma_qp(h, 0, s->current_picture.qscale_table[mb_xy]); |
- h->chroma_qp[1] = get_chroma_qp(h, 1, s->current_picture.qscale_table[mb_xy]); |
- if (!simple && FRAME_MBAFF) { |
- ff_h264_filter_mb (h, mb_x, mb_y, dest_y, dest_cb, dest_cr, linesize, uvlinesize); |
- } else { |
- ff_h264_filter_mb_fast(h, mb_x, mb_y, dest_y, dest_cb, dest_cr, linesize, uvlinesize); |
- } |
- } |
} |
/** |
@@ -1729,16 +1756,16 @@ |
luma_weight_flag= get_bits1(&s->gb); |
if(luma_weight_flag){ |
- h->luma_weight[list][i]= get_se_golomb(&s->gb); |
- h->luma_offset[list][i]= get_se_golomb(&s->gb); |
- if( h->luma_weight[list][i] != luma_def |
- || h->luma_offset[list][i] != 0) { |
+ h->luma_weight[i][list][0]= get_se_golomb(&s->gb); |
+ h->luma_weight[i][list][1]= get_se_golomb(&s->gb); |
+ if( h->luma_weight[i][list][0] != luma_def |
+ || h->luma_weight[i][list][1] != 0) { |
h->use_weight= 1; |
h->luma_weight_flag[list]= 1; |
} |
}else{ |
- h->luma_weight[list][i]= luma_def; |
- h->luma_offset[list][i]= 0; |
+ h->luma_weight[i][list][0]= luma_def; |
+ h->luma_weight[i][list][1]= 0; |
} |
if(CHROMA){ |
@@ -1746,10 +1773,10 @@ |
if(chroma_weight_flag){ |
int j; |
for(j=0; j<2; j++){ |
- h->chroma_weight[list][i][j]= get_se_golomb(&s->gb); |
- h->chroma_offset[list][i][j]= get_se_golomb(&s->gb); |
- if( h->chroma_weight[list][i][j] != chroma_def |
- || h->chroma_offset[list][i][j] != 0) { |
+ h->chroma_weight[i][list][j][0]= get_se_golomb(&s->gb); |
+ h->chroma_weight[i][list][j][1]= get_se_golomb(&s->gb); |
+ if( h->chroma_weight[i][list][j][0] != chroma_def |
+ || h->chroma_weight[i][list][j][1] != 0) { |
h->use_weight_chroma= 1; |
h->chroma_weight_flag[list]= 1; |
} |
@@ -1757,8 +1784,8 @@ |
}else{ |
int j; |
for(j=0; j<2; j++){ |
- h->chroma_weight[list][i][j]= chroma_def; |
- h->chroma_offset[list][i][j]= 0; |
+ h->chroma_weight[i][list][j][0]= chroma_def; |
+ h->chroma_weight[i][list][j][1]= 0; |
} |
} |
} |
@@ -1796,16 +1823,14 @@ |
for(ref1=0; ref1 < h->ref_count[1]; ref1++){ |
int poc1 = h->ref_list[1][ref1].poc; |
int td = av_clip(poc1 - poc0, -128, 127); |
+ h->implicit_weight[ref0][ref1] = 32; |
if(td){ |
int tb = av_clip(cur_poc - poc0, -128, 127); |
int tx = (16384 + (FFABS(td) >> 1)) / td; |
- int dist_scale_factor = av_clip((tb*tx + 32) >> 6, -1024, 1023) >> 2; |
- if(dist_scale_factor < -64 || dist_scale_factor > 128) |
- h->implicit_weight[ref0][ref1] = 32; |
- else |
+ int dist_scale_factor = (tb*tx + 32) >> 8; |
+ if(dist_scale_factor >= -64 && dist_scale_factor <= 128) |
h->implicit_weight[ref0][ref1] = 64 - dist_scale_factor; |
- }else |
- h->implicit_weight[ref0][ref1] = 32; |
+ } |
} |
} |
} |
@@ -2106,11 +2131,6 @@ |
h->slice_type_nos= slice_type & 3; |
s->pict_type= h->slice_type; // to make a few old functions happy, it's wrong though |
- if (s->pict_type == FF_B_TYPE && s0->last_picture_ptr == NULL) { |
- av_log(h->s.avctx, AV_LOG_ERROR, |
- "B picture before any references, skipping\n"); |
- return -1; |
- } |
pps_id= get_ue_golomb(&s->gb); |
if(pps_id>=MAX_PPS_COUNT){ |
@@ -2138,7 +2158,6 @@ |
s->mb_height= h->sps.mb_height * (2 - h->sps.frame_mbs_only_flag); |
h->b_stride= s->mb_width*4; |
- h->b8_stride= s->mb_width*2; |
s->width = 16*s->mb_width - 2*FFMIN(h->sps.crop_right, 7); |
if(h->sps.frame_mbs_only_flag) |
@@ -2175,11 +2194,11 @@ |
} |
if(h->sps.timing_info_present_flag){ |
- s->avctx->time_base= (AVRational){h->sps.num_units_in_tick, h->sps.time_scale}; |
- if(h->x264_build > 0 && h->x264_build < 44) |
- s->avctx->time_base.den *= 2; |
+ int64_t den= h->sps.time_scale; |
+ if(h->x264_build < 44U) |
+ den *= 2; |
av_reduce(&s->avctx->time_base.num, &s->avctx->time_base.den, |
- s->avctx->time_base.num, s->avctx->time_base.den, 1<<30); |
+ h->sps.num_units_in_tick, den, 1<<30); |
} |
s->avctx->pix_fmt = s->avctx->get_format(s->avctx, s->avctx->codec->pix_fmts); |
s->avctx->hwaccel = ff_find_hwaccel(s->avctx->codec->id, s->avctx->pix_fmt); |
@@ -2204,7 +2223,7 @@ |
c->sps = h->sps; |
c->pps = h->pps; |
init_scan_tables(c); |
- clone_tables(c, h); |
+ clone_tables(c, h, i); |
} |
for(i = 0; i < s->avctx->thread_count; i++) |
@@ -2395,9 +2414,9 @@ |
if( (h->pps.weighted_pred && h->slice_type_nos == FF_P_TYPE ) |
|| (h->pps.weighted_bipred_idc==1 && h->slice_type_nos== FF_B_TYPE ) ) |
pred_weight_table(h); |
- else if(h->pps.weighted_bipred_idc==2 && h->slice_type_nos== FF_B_TYPE) |
+ else if(h->pps.weighted_bipred_idc==2 && h->slice_type_nos== FF_B_TYPE){ |
implicit_weight_table(h); |
- else { |
+ }else { |
h->use_weight = 0; |
for (i = 0; i < 2; i++) { |
h->luma_weight_flag[i] = 0; |
@@ -2580,7 +2599,7 @@ |
if(h->deblocking_filter) { |
for(mb_x= 0; mb_x<s->mb_width; mb_x++){ |
for(mb_y=end_mb_y - FRAME_MBAFF; mb_y<= end_mb_y; mb_y++){ |
- int list, mb_xy, mb_type; |
+ int mb_xy, mb_type; |
mb_xy = h->mb_xy = mb_x + mb_y*s->mb_stride; |
h->slice_num= h->slice_table[mb_xy]; |
mb_type= s->current_picture.mb_type[mb_xy]; |
@@ -2625,8 +2644,21 @@ |
h->slice_type= old_slice_type; |
s->mb_x= 0; |
s->mb_y= end_mb_y - FRAME_MBAFF; |
+ h->chroma_qp[0] = get_chroma_qp(h, 0, s->qscale); |
+ h->chroma_qp[1] = get_chroma_qp(h, 1, s->qscale); |
} |
+static void predict_field_decoding_flag(H264Context *h){ |
+ MpegEncContext * const s = &h->s; |
+ const int mb_xy= s->mb_x + s->mb_y*s->mb_stride; |
+ int mb_type = (h->slice_table[mb_xy-1] == h->slice_num) |
+ ? s->current_picture.mb_type[mb_xy-1] |
+ : (h->slice_table[mb_xy-s->mb_stride] == h->slice_num) |
+ ? s->current_picture.mb_type[mb_xy-s->mb_stride] |
+ : 0; |
+ h->mb_mbaff = h->mb_field_decoding_flag = IS_INTERLACED(mb_type) ? 1 : 0; |
+} |
+ |
/** |
* Draw edges and report progress for the last MB row. |
*/ |
@@ -2701,6 +2733,10 @@ |
} |
eos = get_cabac_terminate( &h->cabac ); |
+ if((s->workaround_bugs & FF_BUG_TRUNCATED) && h->cabac.bytestream > h->cabac.bytestream_end + 2){ |
+ 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); |
+ return 0; |
+ } |
if( ret < 0 || h->cabac.bytestream > h->cabac.bytestream_end + 2) { |
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); |
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); |
@@ -2714,6 +2750,8 @@ |
++s->mb_y; |
if(FIELD_OR_MBAFF_PICTURE) { |
++s->mb_y; |
+ if(FRAME_MBAFF && s->mb_y < s->mb_height) |
+ predict_field_decoding_flag(h); |
} |
} |
@@ -2752,6 +2790,8 @@ |
++s->mb_y; |
if(FIELD_OR_MBAFF_PICTURE) { |
++s->mb_y; |
+ if(FRAME_MBAFF && s->mb_y < s->mb_height) |
+ predict_field_decoding_flag(h); |
} |
if(s->mb_y >= s->mb_height){ |
tprintf(s->avctx, "slice end %d %d\n", get_bits_count(&s->gb), s->gb.size_in_bits); |
@@ -2936,8 +2976,15 @@ |
if (ptr==NULL || dst_length < 0){ |
return -1; |
} |
+ i= buf_index + consumed; |
+ if((s->workaround_bugs & FF_BUG_AUTODETECT) && i+3<next_avc && |
+ buf[i]==0x00 && buf[i+1]==0x00 && buf[i+2]==0x01 && buf[i+3]==0xE0) |
+ s->workaround_bugs |= FF_BUG_TRUNCATED; |
+ |
+ if(!(s->workaround_bugs & FF_BUG_TRUNCATED)){ |
while(ptr[dst_length - 1] == 0 && dst_length > 0) |
dst_length--; |
+ } |
bit_length= !dst_length ? 0 : (8*dst_length - ff_h264_decode_rbsp_trailing(h, ptr + dst_length - 1)); |
if(s->avctx->debug&FF_DEBUG_STARTCODE){ |
@@ -3143,53 +3190,6 @@ |
return 0; |
} |
- if(h->is_avc && !h->got_avcC) { |
- int i, cnt, nalsize; |
- unsigned char *p = avctx->extradata; |
- if(avctx->extradata_size < 7) { |
- av_log(avctx, AV_LOG_ERROR, "avcC too short\n"); |
- return -1; |
- } |
- if(*p != 1) { |
- av_log(avctx, AV_LOG_ERROR, "Unknown avcC version %d\n", *p); |
- return -1; |
- } |
- /* sps and pps in the avcC always have length coded with 2 bytes, |
- so put a fake nal_length_size = 2 while parsing them */ |
- h->nal_length_size = 2; |
- // Decode sps from avcC |
- cnt = *(p+5) & 0x1f; // Number of sps |
- p += 6; |
- for (i = 0; i < cnt; i++) { |
- nalsize = AV_RB16(p) + 2; |
- if(decode_nal_units(h, p, nalsize) < 0) { |
- av_log(avctx, AV_LOG_ERROR, "Decoding sps %d from avcC failed\n", i); |
- return -1; |
- } |
- p += nalsize; |
- } |
- // Decode pps from avcC |
- cnt = *(p++); // Number of pps |
- for (i = 0; i < cnt; i++) { |
- nalsize = AV_RB16(p) + 2; |
- if(decode_nal_units(h, p, nalsize) != nalsize) { |
- av_log(avctx, AV_LOG_ERROR, "Decoding pps %d from avcC failed\n", i); |
- return -1; |
- } |
- p += nalsize; |
- } |
- // Now store right nal length size, that will be use to parse all other nals |
- h->nal_length_size = ((*(((char*)(avctx->extradata))+4))&0x03)+1; |
- // Do not reparse avcC |
- h->got_avcC = 1; |
- } |
- |
- if(!h->got_avcC && !h->is_avc && s->avctx->extradata_size){ |
- if(decode_nal_units(h, s->avctx->extradata, s->avctx->extradata_size) < 0) |
- return -1; |
- h->got_avcC = 1; |
- } |
- |
buf_index=decode_nal_units(h, buf, buf_size); |
if(buf_index < 0) |
return -1; |