| OLD | NEW |
| 1 /* | 1 /* |
| 2 * H.26L/H.264/AVC/JVT/14496-10/... encoder/decoder | 2 * H.26L/H.264/AVC/JVT/14496-10/... encoder/decoder |
| 3 * Copyright (c) 2003 Michael Niedermayer <michaelni@gmx.at> | 3 * Copyright (c) 2003 Michael Niedermayer <michaelni@gmx.at> |
| 4 * | 4 * |
| 5 * This file is part of FFmpeg. | 5 * This file is part of FFmpeg. |
| 6 * | 6 * |
| 7 * FFmpeg is free software; you can redistribute it and/or | 7 * FFmpeg is free software; you can redistribute it and/or |
| 8 * modify it under the terms of the GNU Lesser General Public | 8 * modify it under the terms of the GNU Lesser General Public |
| 9 * License as published by the Free Software Foundation; either | 9 * License as published by the Free Software Foundation; either |
| 10 * version 2.1 of the License, or (at your option) any later version. | 10 * version 2.1 of the License, or (at your option) any later version. |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 46 | 46 |
| 47 static const uint8_t rem6[52]={ | 47 static const uint8_t rem6[52]={ |
| 48 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, | 48 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, |
| 49 }; | 49 }; |
| 50 | 50 |
| 51 static const uint8_t div6[52]={ | 51 static const uint8_t div6[52]={ |
| 52 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, | 52 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, |
| 53 }; | 53 }; |
| 54 | 54 |
| 55 void ff_h264_write_back_intra_pred_mode(H264Context *h){ | 55 void ff_h264_write_back_intra_pred_mode(H264Context *h){ |
| 56 const int mb_xy= h->mb_xy; | 56 int8_t *mode= h->intra4x4_pred_mode + h->mb2br_xy[h->mb_xy]; |
| 57 | 57 |
| 58 h->intra4x4_pred_mode[mb_xy][0]= h->intra4x4_pred_mode_cache[7+8*1]; | 58 AV_COPY32(mode, h->intra4x4_pred_mode_cache + 4 + 8*4); |
| 59 h->intra4x4_pred_mode[mb_xy][1]= h->intra4x4_pred_mode_cache[7+8*2]; | 59 mode[4]= h->intra4x4_pred_mode_cache[7+8*3]; |
| 60 h->intra4x4_pred_mode[mb_xy][2]= h->intra4x4_pred_mode_cache[7+8*3]; | 60 mode[5]= h->intra4x4_pred_mode_cache[7+8*2]; |
| 61 h->intra4x4_pred_mode[mb_xy][3]= h->intra4x4_pred_mode_cache[7+8*4]; | 61 mode[6]= h->intra4x4_pred_mode_cache[7+8*1]; |
| 62 h->intra4x4_pred_mode[mb_xy][4]= h->intra4x4_pred_mode_cache[4+8*4]; | |
| 63 h->intra4x4_pred_mode[mb_xy][5]= h->intra4x4_pred_mode_cache[5+8*4]; | |
| 64 h->intra4x4_pred_mode[mb_xy][6]= h->intra4x4_pred_mode_cache[6+8*4]; | |
| 65 } | 62 } |
| 66 | 63 |
| 67 /** | 64 /** |
| 68 * checks if the top & left blocks are available if needed & changes the dc mode
so it only uses the available blocks. | 65 * checks if the top & left blocks are available if needed & changes the dc mode
so it only uses the available blocks. |
| 69 */ | 66 */ |
| 70 int ff_h264_check_intra4x4_pred_mode(H264Context *h){ | 67 int ff_h264_check_intra4x4_pred_mode(H264Context *h){ |
| 71 MpegEncContext * const s = &h->s; | 68 MpegEncContext * const s = &h->s; |
| 72 static const int8_t top [12]= {-1, 0,LEFT_DC_PRED,-1,-1,-1,-1,-1, 0}; | 69 static const int8_t top [12]= {-1, 0,LEFT_DC_PRED,-1,-1,-1,-1,-1, 0}; |
| 73 static const int8_t left[12]= { 0,-1, TOP_DC_PRED, 0,-1,-1,-1, 0,-1,DC_128_P
RED}; | 70 static const int8_t left[12]= { 0,-1, TOP_DC_PRED, 0,-1,-1,-1, 0,-1,DC_128_P
RED}; |
| 74 int i; | 71 int i; |
| (...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 150 src++; length--; | 147 src++; length--; |
| 151 #if 0 | 148 #if 0 |
| 152 for(i=0; i<length; i++) | 149 for(i=0; i<length; i++) |
| 153 printf("%2X ", src[i]); | 150 printf("%2X ", src[i]); |
| 154 #endif | 151 #endif |
| 155 | 152 |
| 156 #if HAVE_FAST_UNALIGNED | 153 #if HAVE_FAST_UNALIGNED |
| 157 # if HAVE_FAST_64BIT | 154 # if HAVE_FAST_64BIT |
| 158 # define RS 7 | 155 # define RS 7 |
| 159 for(i=0; i+1<length; i+=9){ | 156 for(i=0; i+1<length; i+=9){ |
| 160 if(!((~*(const uint64_t*)(src+i) & (*(const uint64_t*)(src+i) - 0x010001
0001000101ULL)) & 0x8000800080008080ULL)) | 157 if(!((~AV_RN64A(src+i) & (AV_RN64A(src+i) - 0x0100010001000101ULL)) & 0x
8000800080008080ULL)) |
| 161 # else | 158 # else |
| 162 # define RS 3 | 159 # define RS 3 |
| 163 for(i=0; i+1<length; i+=5){ | 160 for(i=0; i+1<length; i+=5){ |
| 164 if(!((~*(const uint32_t*)(src+i) & (*(const uint32_t*)(src+i) - 0x010001
01U)) & 0x80008080U)) | 161 if(!((~AV_RN32A(src+i) & (AV_RN32A(src+i) - 0x01000101U)) & 0x80008080U)
) |
| 165 # endif | 162 # endif |
| 166 continue; | 163 continue; |
| 167 if(i>0 && !src[i]) i--; | 164 if(i>0 && !src[i]) i--; |
| 168 while(src[i]) i++; | 165 while(src[i]) i++; |
| 169 #else | 166 #else |
| 170 # define RS 0 | 167 # define RS 0 |
| 171 for(i=0; i+1<length; i+=2){ | 168 for(i=0; i+1<length; i+=2){ |
| 172 if(src[i]) continue; | 169 if(src[i]) continue; |
| 173 if(i>0 && src[i-1]==0) i--; | 170 if(i>0 && src[i-1]==0) i--; |
| 174 #endif | 171 #endif |
| (...skipping 448 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 623 x_offset, y_offset, qpix_put, chroma_put); | 620 x_offset, y_offset, qpix_put, chroma_put); |
| 624 | 621 |
| 625 if(h->use_weight == 2){ | 622 if(h->use_weight == 2){ |
| 626 int weight0 = h->implicit_weight[refn0][refn1]; | 623 int weight0 = h->implicit_weight[refn0][refn1]; |
| 627 int weight1 = 64 - weight0; | 624 int weight1 = 64 - weight0; |
| 628 luma_weight_avg( dest_y, tmp_y, h-> mb_linesize, 5, weight0, wei
ght1, 0); | 625 luma_weight_avg( dest_y, tmp_y, h-> mb_linesize, 5, weight0, wei
ght1, 0); |
| 629 chroma_weight_avg(dest_cb, tmp_cb, h->mb_uvlinesize, 5, weight0, wei
ght1, 0); | 626 chroma_weight_avg(dest_cb, tmp_cb, h->mb_uvlinesize, 5, weight0, wei
ght1, 0); |
| 630 chroma_weight_avg(dest_cr, tmp_cr, h->mb_uvlinesize, 5, weight0, wei
ght1, 0); | 627 chroma_weight_avg(dest_cr, tmp_cr, h->mb_uvlinesize, 5, weight0, wei
ght1, 0); |
| 631 }else{ | 628 }else{ |
| 632 luma_weight_avg(dest_y, tmp_y, h->mb_linesize, h->luma_log2_weight_d
enom, | 629 luma_weight_avg(dest_y, tmp_y, h->mb_linesize, h->luma_log2_weight_d
enom, |
| 633 h->luma_weight[0][refn0], h->luma_weight[1][refn1], | 630 h->luma_weight[refn0][0][0] , h->luma_weight[refn1][
1][0], |
| 634 h->luma_offset[0][refn0] + h->luma_offset[1][refn1])
; | 631 h->luma_weight[refn0][0][1] + h->luma_weight[refn1][
1][1]); |
| 635 chroma_weight_avg(dest_cb, tmp_cb, h->mb_uvlinesize, h->chroma_log2_
weight_denom, | 632 chroma_weight_avg(dest_cb, tmp_cb, h->mb_uvlinesize, h->chroma_log2_
weight_denom, |
| 636 h->chroma_weight[0][refn0][0], h->chroma_weight[1][r
efn1][0], | 633 h->chroma_weight[refn0][0][0][0] , h->chroma_weight[
refn1][1][0][0], |
| 637 h->chroma_offset[0][refn0][0] + h->chroma_offset[1][
refn1][0]); | 634 h->chroma_weight[refn0][0][0][1] + h->chroma_weight[
refn1][1][0][1]); |
| 638 chroma_weight_avg(dest_cr, tmp_cr, h->mb_uvlinesize, h->chroma_log2_
weight_denom, | 635 chroma_weight_avg(dest_cr, tmp_cr, h->mb_uvlinesize, h->chroma_log2_
weight_denom, |
| 639 h->chroma_weight[0][refn0][1], h->chroma_weight[1][r
efn1][1], | 636 h->chroma_weight[refn0][0][1][0] , h->chroma_weight[
refn1][1][1][0], |
| 640 h->chroma_offset[0][refn0][1] + h->chroma_offset[1][
refn1][1]); | 637 h->chroma_weight[refn0][0][1][1] + h->chroma_weight[
refn1][1][1][1]); |
| 641 } | 638 } |
| 642 }else{ | 639 }else{ |
| 643 int list = list1 ? 1 : 0; | 640 int list = list1 ? 1 : 0; |
| 644 int refn = h->ref_cache[list][ scan8[n] ]; | 641 int refn = h->ref_cache[list][ scan8[n] ]; |
| 645 Picture *ref= &h->ref_list[list][refn]; | 642 Picture *ref= &h->ref_list[list][refn]; |
| 646 mc_dir_part(h, ref, n, square, chroma_height, delta, list, | 643 mc_dir_part(h, ref, n, square, chroma_height, delta, list, |
| 647 dest_y, dest_cb, dest_cr, x_offset, y_offset, | 644 dest_y, dest_cb, dest_cr, x_offset, y_offset, |
| 648 qpix_put, chroma_put); | 645 qpix_put, chroma_put); |
| 649 | 646 |
| 650 luma_weight_op(dest_y, h->mb_linesize, h->luma_log2_weight_denom, | 647 luma_weight_op(dest_y, h->mb_linesize, h->luma_log2_weight_denom, |
| 651 h->luma_weight[list][refn], h->luma_offset[list][refn]); | 648 h->luma_weight[refn][list][0], h->luma_weight[refn][list]
[1]); |
| 652 if(h->use_weight_chroma){ | 649 if(h->use_weight_chroma){ |
| 653 chroma_weight_op(dest_cb, h->mb_uvlinesize, h->chroma_log2_weight_de
nom, | 650 chroma_weight_op(dest_cb, h->mb_uvlinesize, h->chroma_log2_weight_de
nom, |
| 654 h->chroma_weight[list][refn][0], h->chroma_offset[l
ist][refn][0]); | 651 h->chroma_weight[refn][list][0][0], h->chroma_weigh
t[refn][list][0][1]); |
| 655 chroma_weight_op(dest_cr, h->mb_uvlinesize, h->chroma_log2_weight_de
nom, | 652 chroma_weight_op(dest_cr, h->mb_uvlinesize, h->chroma_log2_weight_de
nom, |
| 656 h->chroma_weight[list][refn][1], h->chroma_offset[l
ist][refn][1]); | 653 h->chroma_weight[refn][list][1][0], h->chroma_weigh
t[refn][list][1][1]); |
| 657 } | 654 } |
| 658 } | 655 } |
| 659 } | 656 } |
| 660 | 657 |
| 661 static inline void mc_part(H264Context *h, int n, int square, int chroma_height,
int delta, | 658 static inline void mc_part(H264Context *h, int n, int square, int chroma_height,
int delta, |
| 662 uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr, | 659 uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr, |
| 663 int x_offset, int y_offset, | 660 int x_offset, int y_offset, |
| 664 qpel_mc_func *qpix_put, h264_chroma_mc_func chroma_pu
t, | 661 qpel_mc_func *qpix_put, h264_chroma_mc_func chroma_pu
t, |
| 665 qpel_mc_func *qpix_avg, h264_chroma_mc_func chroma_av
g, | 662 qpel_mc_func *qpix_avg, h264_chroma_mc_func chroma_av
g, |
| 666 h264_weight_func *weight_op, h264_biweight_func *weig
ht_avg, | 663 h264_weight_func *weight_op, h264_biweight_func *weig
ht_avg, |
| (...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 790 av_freep(&h->cbp_table); | 787 av_freep(&h->cbp_table); |
| 791 av_freep(&h->mvd_table[0]); | 788 av_freep(&h->mvd_table[0]); |
| 792 av_freep(&h->mvd_table[1]); | 789 av_freep(&h->mvd_table[1]); |
| 793 av_freep(&h->direct_table); | 790 av_freep(&h->direct_table); |
| 794 av_freep(&h->non_zero_count); | 791 av_freep(&h->non_zero_count); |
| 795 av_freep(&h->slice_table_base); | 792 av_freep(&h->slice_table_base); |
| 796 h->slice_table= NULL; | 793 h->slice_table= NULL; |
| 797 av_freep(&h->list_counts); | 794 av_freep(&h->list_counts); |
| 798 | 795 |
| 799 av_freep(&h->mb2b_xy); | 796 av_freep(&h->mb2b_xy); |
| 800 av_freep(&h->mb2b8_xy); | 797 av_freep(&h->mb2br_xy); |
| 801 | 798 |
| 802 for(i = 0; i < MAX_THREADS; i++) { | 799 for(i = 0; i < MAX_THREADS; i++) { |
| 803 hx = h->thread_context[i]; | 800 hx = h->thread_context[i]; |
| 804 if(!hx) continue; | 801 if(!hx) continue; |
| 805 av_freep(&hx->top_borders[1]); | 802 av_freep(&hx->top_borders[1]); |
| 806 av_freep(&hx->top_borders[0]); | 803 av_freep(&hx->top_borders[0]); |
| 807 av_freep(&hx->s.obmc_scratchpad); | 804 av_freep(&hx->s.obmc_scratchpad); |
| 808 av_freep(&hx->rbsp_buffer[1]); | 805 av_freep(&hx->rbsp_buffer[1]); |
| 809 av_freep(&hx->rbsp_buffer[0]); | 806 av_freep(&hx->rbsp_buffer[0]); |
| 810 hx->rbsp_buffer_size[0] = 0; | 807 hx->rbsp_buffer_size[0] = 0; |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 874 for(i=0; i<2; i++) | 871 for(i=0; i<2; i++) |
| 875 for(x=0; x<64; x++) | 872 for(x=0; x<64; x++) |
| 876 h->dequant8_coeff[i][0][x] = 1<<6; | 873 h->dequant8_coeff[i][0][x] = 1<<6; |
| 877 } | 874 } |
| 878 } | 875 } |
| 879 | 876 |
| 880 | 877 |
| 881 int ff_h264_alloc_tables(H264Context *h){ | 878 int ff_h264_alloc_tables(H264Context *h){ |
| 882 MpegEncContext * const s = &h->s; | 879 MpegEncContext * const s = &h->s; |
| 883 const int big_mb_num= s->mb_stride * (s->mb_height+1); | 880 const int big_mb_num= s->mb_stride * (s->mb_height+1); |
| 881 const int row_mb_num= 2*s->mb_stride*s->avctx->thread_count; |
| 884 int x,y; | 882 int x,y; |
| 885 | 883 |
| 886 FF_ALLOCZ_OR_GOTO(h->s.avctx, h->intra4x4_pred_mode, big_mb_num * 8 * sizeo
f(uint8_t), fail) | 884 FF_ALLOCZ_OR_GOTO(h->s.avctx, h->intra4x4_pred_mode, row_mb_num * 8 * sizeo
f(uint8_t), fail) |
| 887 | 885 |
| 888 FF_ALLOCZ_OR_GOTO(h->s.avctx, h->non_zero_count , big_mb_num * 32 * sizeo
f(uint8_t), fail) | 886 FF_ALLOCZ_OR_GOTO(h->s.avctx, h->non_zero_count , big_mb_num * 32 * sizeo
f(uint8_t), fail) |
| 889 FF_ALLOCZ_OR_GOTO(h->s.avctx, h->slice_table_base , (big_mb_num+s->mb_strid
e) * sizeof(*h->slice_table_base), fail) | 887 FF_ALLOCZ_OR_GOTO(h->s.avctx, h->slice_table_base , (big_mb_num+s->mb_strid
e) * sizeof(*h->slice_table_base), fail) |
| 890 FF_ALLOCZ_OR_GOTO(h->s.avctx, h->cbp_table, big_mb_num * sizeof(uint16_t), f
ail) | 888 FF_ALLOCZ_OR_GOTO(h->s.avctx, h->cbp_table, big_mb_num * sizeof(uint16_t), f
ail) |
| 891 | 889 |
| 892 FF_ALLOCZ_OR_GOTO(h->s.avctx, h->chroma_pred_mode_table, big_mb_num * sizeof
(uint8_t), fail) | 890 FF_ALLOCZ_OR_GOTO(h->s.avctx, h->chroma_pred_mode_table, big_mb_num * sizeof
(uint8_t), fail) |
| 893 FF_ALLOCZ_OR_GOTO(h->s.avctx, h->mvd_table[0], 32*big_mb_num * sizeof(uint16
_t), fail); | 891 FF_ALLOCZ_OR_GOTO(h->s.avctx, h->mvd_table[0], 16*row_mb_num * sizeof(uint8_
t), fail); |
| 894 FF_ALLOCZ_OR_GOTO(h->s.avctx, h->mvd_table[1], 32*big_mb_num * sizeof(uint16
_t), fail); | 892 FF_ALLOCZ_OR_GOTO(h->s.avctx, h->mvd_table[1], 16*row_mb_num * sizeof(uint8_
t), fail); |
| 895 FF_ALLOCZ_OR_GOTO(h->s.avctx, h->direct_table, 32*big_mb_num * sizeof(uint8_
t) , fail); | 893 FF_ALLOCZ_OR_GOTO(h->s.avctx, h->direct_table, 4*big_mb_num * sizeof(uint8_t
) , fail); |
| 896 FF_ALLOCZ_OR_GOTO(h->s.avctx, h->list_counts, big_mb_num * sizeof(uint8_t),
fail) | 894 FF_ALLOCZ_OR_GOTO(h->s.avctx, h->list_counts, big_mb_num * sizeof(uint8_t),
fail) |
| 897 | 895 |
| 898 memset(h->slice_table_base, -1, (big_mb_num+s->mb_stride) * sizeof(*h->slic
e_table_base)); | 896 memset(h->slice_table_base, -1, (big_mb_num+s->mb_stride) * sizeof(*h->slic
e_table_base)); |
| 899 h->slice_table= h->slice_table_base + s->mb_stride*2 + 1; | 897 h->slice_table= h->slice_table_base + s->mb_stride*2 + 1; |
| 900 | 898 |
| 901 FF_ALLOCZ_OR_GOTO(h->s.avctx, h->mb2b_xy , big_mb_num * sizeof(uint32_t), f
ail); | 899 FF_ALLOCZ_OR_GOTO(h->s.avctx, h->mb2b_xy , big_mb_num * sizeof(uint32_t), f
ail); |
| 902 FF_ALLOCZ_OR_GOTO(h->s.avctx, h->mb2b8_xy , big_mb_num * sizeof(uint32_t), f
ail); | 900 FF_ALLOCZ_OR_GOTO(h->s.avctx, h->mb2br_xy , big_mb_num * sizeof(uint32_t), f
ail); |
| 903 for(y=0; y<s->mb_height; y++){ | 901 for(y=0; y<s->mb_height; y++){ |
| 904 for(x=0; x<s->mb_width; x++){ | 902 for(x=0; x<s->mb_width; x++){ |
| 905 const int mb_xy= x + y*s->mb_stride; | 903 const int mb_xy= x + y*s->mb_stride; |
| 906 const int b_xy = 4*x + 4*y*h->b_stride; | 904 const int b_xy = 4*x + 4*y*h->b_stride; |
| 907 const int b8_xy= 2*x + 2*y*h->b8_stride; | |
| 908 | 905 |
| 909 h->mb2b_xy [mb_xy]= b_xy; | 906 h->mb2b_xy [mb_xy]= b_xy; |
| 910 h->mb2b8_xy[mb_xy]= b8_xy; | 907 h->mb2br_xy[mb_xy]= 8*(FMO ? mb_xy : (mb_xy % (2*s->mb_stride))); |
| 911 } | 908 } |
| 912 } | 909 } |
| 913 | 910 |
| 914 s->obmc_scratchpad = NULL; | 911 s->obmc_scratchpad = NULL; |
| 915 | 912 |
| 916 if(!h->dequant4_coeff[0]) | 913 if(!h->dequant4_coeff[0]) |
| 917 init_dequant_tables(h); | 914 init_dequant_tables(h); |
| 918 | 915 |
| 919 return 0; | 916 return 0; |
| 920 fail: | 917 fail: |
| 921 free_tables(h); | 918 free_tables(h); |
| 922 return -1; | 919 return -1; |
| 923 } | 920 } |
| 924 | 921 |
| 925 /** | 922 /** |
| 926 * Mimic alloc_tables(), but for every context thread. | 923 * Mimic alloc_tables(), but for every context thread. |
| 927 */ | 924 */ |
| 928 static void clone_tables(H264Context *dst, H264Context *src){ | 925 static void clone_tables(H264Context *dst, H264Context *src, int i){ |
| 929 dst->intra4x4_pred_mode = src->intra4x4_pred_mode; | 926 MpegEncContext * const s = &src->s; |
| 927 dst->intra4x4_pred_mode = src->intra4x4_pred_mode + i*8*2*s->mb_stride
; |
| 930 dst->non_zero_count = src->non_zero_count; | 928 dst->non_zero_count = src->non_zero_count; |
| 931 dst->slice_table = src->slice_table; | 929 dst->slice_table = src->slice_table; |
| 932 dst->cbp_table = src->cbp_table; | 930 dst->cbp_table = src->cbp_table; |
| 933 dst->mb2b_xy = src->mb2b_xy; | 931 dst->mb2b_xy = src->mb2b_xy; |
| 934 dst->mb2b8_xy = src->mb2b8_xy; | 932 dst->mb2br_xy = src->mb2br_xy; |
| 935 dst->chroma_pred_mode_table = src->chroma_pred_mode_table; | 933 dst->chroma_pred_mode_table = src->chroma_pred_mode_table; |
| 936 dst->mvd_table[0] = src->mvd_table[0]; | 934 dst->mvd_table[0] = src->mvd_table[0] + i*8*2*s->mb_stride; |
| 937 dst->mvd_table[1] = src->mvd_table[1]; | 935 dst->mvd_table[1] = src->mvd_table[1] + i*8*2*s->mb_stride; |
| 938 dst->direct_table = src->direct_table; | 936 dst->direct_table = src->direct_table; |
| 939 dst->list_counts = src->list_counts; | 937 dst->list_counts = src->list_counts; |
| 940 | 938 |
| 941 dst->s.obmc_scratchpad = NULL; | 939 dst->s.obmc_scratchpad = NULL; |
| 942 ff_h264_pred_init(&dst->hpc, src->s.codec_id); | 940 ff_h264_pred_init(&dst->hpc, src->s.codec_id); |
| 943 } | 941 } |
| 944 | 942 |
| 945 /** | 943 /** |
| 946 * Init context | 944 * Init context |
| 947 * Allocate buffers which are not shared amongst multiple threads. | 945 * Allocate buffers which are not shared amongst multiple threads. |
| 948 */ | 946 */ |
| 949 static int context_init(H264Context *h){ | 947 static int context_init(H264Context *h){ |
| 950 FF_ALLOCZ_OR_GOTO(h->s.avctx, h->top_borders[0], h->s.mb_width * (16+8+8) *
sizeof(uint8_t), fail) | 948 FF_ALLOCZ_OR_GOTO(h->s.avctx, h->top_borders[0], h->s.mb_width * (16+8+8) *
sizeof(uint8_t), fail) |
| 951 FF_ALLOCZ_OR_GOTO(h->s.avctx, h->top_borders[1], h->s.mb_width * (16+8+8) *
sizeof(uint8_t), fail) | 949 FF_ALLOCZ_OR_GOTO(h->s.avctx, h->top_borders[1], h->s.mb_width * (16+8+8) *
sizeof(uint8_t), fail) |
| 952 | 950 |
| 951 h->ref_cache[0][scan8[5 ]+1] = h->ref_cache[0][scan8[7 ]+1] = h->ref_cache[0
][scan8[13]+1] = |
| 952 h->ref_cache[1][scan8[5 ]+1] = h->ref_cache[1][scan8[7 ]+1] = h->ref_cache[1
][scan8[13]+1] = PART_NOT_AVAILABLE; |
| 953 |
| 953 return 0; | 954 return 0; |
| 954 fail: | 955 fail: |
| 955 return -1; // free_tables will clean up for us | 956 return -1; // free_tables will clean up for us |
| 956 } | 957 } |
| 957 | 958 |
| 959 static int decode_nal_units(H264Context *h, const uint8_t *buf, int buf_size); |
| 960 |
| 958 static av_cold void common_init(H264Context *h){ | 961 static av_cold void common_init(H264Context *h){ |
| 959 MpegEncContext * const s = &h->s; | 962 MpegEncContext * const s = &h->s; |
| 960 | 963 |
| 961 s->width = s->avctx->width; | 964 s->width = s->avctx->width; |
| 962 s->height = s->avctx->height; | 965 s->height = s->avctx->height; |
| 963 s->codec_id= s->avctx->codec->id; | 966 s->codec_id= s->avctx->codec->id; |
| 964 | 967 |
| 965 ff_h264_pred_init(&h->hpc, s->codec_id); | 968 ff_h264_pred_init(&h->hpc, s->codec_id); |
| 966 | 969 |
| 967 h->dequant_coeff_pps= -1; | 970 h->dequant_coeff_pps= -1; |
| (...skipping 21 matching lines...) Expand all Loading... |
| 989 // set defaults | 992 // set defaults |
| 990 // s->decode_mb= ff_h263_decode_mb; | 993 // s->decode_mb= ff_h263_decode_mb; |
| 991 s->quarter_sample = 1; | 994 s->quarter_sample = 1; |
| 992 if(!avctx->has_b_frames) | 995 if(!avctx->has_b_frames) |
| 993 s->low_delay= 1; | 996 s->low_delay= 1; |
| 994 | 997 |
| 995 avctx->chroma_sample_location = AVCHROMA_LOC_LEFT; | 998 avctx->chroma_sample_location = AVCHROMA_LOC_LEFT; |
| 996 | 999 |
| 997 ff_h264_decode_init_vlc(); | 1000 ff_h264_decode_init_vlc(); |
| 998 | 1001 |
| 999 if(avctx->extradata_size > 0 && avctx->extradata && | |
| 1000 *(char *)avctx->extradata == 1){ | |
| 1001 h->is_avc = 1; | |
| 1002 h->got_avcC = 0; | |
| 1003 } else { | |
| 1004 h->is_avc = 0; | |
| 1005 } | |
| 1006 | |
| 1007 h->thread_context[0] = h; | 1002 h->thread_context[0] = h; |
| 1008 h->outputed_poc = INT_MIN; | 1003 h->outputed_poc = INT_MIN; |
| 1009 h->prev_poc_msb= 1<<16; | 1004 h->prev_poc_msb= 1<<16; |
| 1005 h->x264_build = -1; |
| 1010 ff_h264_reset_sei(h); | 1006 ff_h264_reset_sei(h); |
| 1011 if(avctx->codec_id == CODEC_ID_H264){ | 1007 if(avctx->codec_id == CODEC_ID_H264){ |
| 1012 if(avctx->ticks_per_frame == 1){ | 1008 if(avctx->ticks_per_frame == 1){ |
| 1013 s->avctx->time_base.den *=2; | 1009 s->avctx->time_base.den *=2; |
| 1014 } | 1010 } |
| 1015 avctx->ticks_per_frame = 2; | 1011 avctx->ticks_per_frame = 2; |
| 1016 } | 1012 } |
| 1013 |
| 1014 if(avctx->extradata_size > 0 && avctx->extradata && *(char *)avctx->extradat
a == 1){ |
| 1015 int i, cnt, nalsize; |
| 1016 unsigned char *p = avctx->extradata; |
| 1017 |
| 1018 h->is_avc = 1; |
| 1019 |
| 1020 if(avctx->extradata_size < 7) { |
| 1021 av_log(avctx, AV_LOG_ERROR, "avcC too short\n"); |
| 1022 return -1; |
| 1023 } |
| 1024 /* sps and pps in the avcC always have length coded with 2 bytes, |
| 1025 so put a fake nal_length_size = 2 while parsing them */ |
| 1026 h->nal_length_size = 2; |
| 1027 // Decode sps from avcC |
| 1028 cnt = *(p+5) & 0x1f; // Number of sps |
| 1029 p += 6; |
| 1030 for (i = 0; i < cnt; i++) { |
| 1031 nalsize = AV_RB16(p) + 2; |
| 1032 if(decode_nal_units(h, p, nalsize) < 0) { |
| 1033 av_log(avctx, AV_LOG_ERROR, "Decoding sps %d from avcC failed\n"
, i); |
| 1034 return -1; |
| 1035 } |
| 1036 p += nalsize; |
| 1037 } |
| 1038 // Decode pps from avcC |
| 1039 cnt = *(p++); // Number of pps |
| 1040 for (i = 0; i < cnt; i++) { |
| 1041 nalsize = AV_RB16(p) + 2; |
| 1042 if(decode_nal_units(h, p, nalsize) != nalsize) { |
| 1043 av_log(avctx, AV_LOG_ERROR, "Decoding pps %d from avcC failed\n"
, i); |
| 1044 return -1; |
| 1045 } |
| 1046 p += nalsize; |
| 1047 } |
| 1048 // Now store right nal length size, that will be use to parse all other
nals |
| 1049 h->nal_length_size = ((*(((char*)(avctx->extradata))+4))&0x03)+1; |
| 1050 } else { |
| 1051 h->is_avc = 0; |
| 1052 if(decode_nal_units(h, s->avctx->extradata, s->avctx->extradata_size) <
0) |
| 1053 return -1; |
| 1054 } |
| 1055 if(h->sps.bitstream_restriction_flag && s->avctx->has_b_frames < h->sps.num_
reorder_frames){ |
| 1056 s->avctx->has_b_frames = h->sps.num_reorder_frames; |
| 1057 s->low_delay = 0; |
| 1058 } |
| 1059 |
| 1017 return 0; | 1060 return 0; |
| 1018 } | 1061 } |
| 1019 | 1062 |
| 1020 static void copy_picture_range(Picture **to, Picture **from, int count, MpegEncC
ontext *new_base, MpegEncContext *old_base) | 1063 static void copy_picture_range(Picture **to, Picture **from, int count, MpegEncC
ontext *new_base, MpegEncContext *old_base) |
| 1021 { | 1064 { |
| 1022 int i; | 1065 int i; |
| 1023 | 1066 |
| 1024 for (i=0; i<count; i++){ | 1067 for (i=0; i<count; i++){ |
| 1025 to[i] = REBASE_PICTURE(from[i], new_base, old_base); | 1068 to[i] = REBASE_PICTURE(from[i], new_base, old_base); |
| 1026 } | 1069 } |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1065 | 1108 |
| 1066 h->thread_context[0] = h; | 1109 h->thread_context[0] = h; |
| 1067 | 1110 |
| 1068 // frame_start may not be called for the next thread (if it's decoding a
bottom field) | 1111 // frame_start may not be called for the next thread (if it's decoding a
bottom field) |
| 1069 // so this has to be allocated here | 1112 // so this has to be allocated here |
| 1070 h->s.obmc_scratchpad = av_malloc(16*2*s->linesize + 8*2*s->uvlinesize); | 1113 h->s.obmc_scratchpad = av_malloc(16*2*s->linesize + 8*2*s->uvlinesize); |
| 1071 } | 1114 } |
| 1072 | 1115 |
| 1073 //extradata/NAL handling | 1116 //extradata/NAL handling |
| 1074 h->is_avc = h1->is_avc; | 1117 h->is_avc = h1->is_avc; |
| 1075 h->got_avcC = h1->got_avcC; | |
| 1076 | 1118 |
| 1077 //SPS/PPS | 1119 //SPS/PPS |
| 1078 copy_parameter_set((void**)h->sps_buffers, (void**)h1->sps_buffers, MAX_SPS_
COUNT, sizeof(SPS)); | 1120 copy_parameter_set((void**)h->sps_buffers, (void**)h1->sps_buffers, MAX_SPS_
COUNT, sizeof(SPS)); |
| 1079 h->sps = h1->sps; | 1121 h->sps = h1->sps; |
| 1080 copy_parameter_set((void**)h->pps_buffers, (void**)h1->pps_buffers, MAX_PPS_
COUNT, sizeof(PPS)); | 1122 copy_parameter_set((void**)h->pps_buffers, (void**)h1->pps_buffers, MAX_PPS_
COUNT, sizeof(PPS)); |
| 1081 h->pps = h1->pps; | 1123 h->pps = h1->pps; |
| 1082 | 1124 |
| 1083 //Dequantization matrices | 1125 //Dequantization matrices |
| 1084 //FIXME these are big - can they be only copied when PPS changes? | 1126 //FIXME these are big - can they be only copied when PPS changes? |
| 1085 copy_fields(h, h1, dequant4_buffer, dequant4_coeff); | 1127 copy_fields(h, h1, dequant4_buffer, dequant4_coeff); |
| 1086 | 1128 |
| 1087 for(i=0; i<6; i++) | 1129 for(i=0; i<6; i++) |
| 1088 h->dequant4_coeff[i] = h->dequant4_buffer[0] + (h1->dequant4_coeff[i] -
h1->dequant4_buffer[0]); | 1130 h->dequant4_coeff[i] = h->dequant4_buffer[0] + (h1->dequant4_coeff[i] -
h1->dequant4_buffer[0]); |
| 1089 | 1131 |
| 1090 for(i=0; i<2; i++) | 1132 for(i=0; i<2; i++) |
| 1091 h->dequant8_coeff[i] = h->dequant8_buffer[0] + (h1->dequant8_coeff[i] -
h1->dequant8_buffer[0]); | 1133 h->dequant8_coeff[i] = h->dequant8_buffer[0] + (h1->dequant8_coeff[i] -
h1->dequant8_buffer[0]); |
| 1092 | 1134 |
| 1093 h->dequant_coeff_pps = h1->dequant_coeff_pps; | 1135 h->dequant_coeff_pps = h1->dequant_coeff_pps; |
| 1094 | 1136 |
| 1095 //POC timing | 1137 //POC timing |
| 1096 copy_fields(h, h1, poc_lsb, use_weight); | 1138 copy_fields(h, h1, poc_lsb, redundant_pic_count); |
| 1097 | 1139 |
| 1098 //reference lists | 1140 //reference lists |
| 1099 copy_fields(h, h1, ref_count, intra_gb); | 1141 copy_fields(h, h1, ref_count, intra_gb); |
| 1142 copy_fields(h, h1, short_ref, cabac_init_idc); |
| 1100 | 1143 |
| 1101 copy_picture_range(h->short_ref, h1->short_ref, 32, s, s1); | 1144 copy_picture_range(h->short_ref, h1->short_ref, 32, s, s1); |
| 1102 copy_picture_range(h->long_ref, h1->long_ref, 32, s, s1); | 1145 copy_picture_range(h->long_ref, h1->long_ref, 32, s, s1); |
| 1103 copy_picture_range(h->delayed_pic, h1->delayed_pic, MAX_DELAYED_PIC_COUNT+2,
s, s1); | 1146 copy_picture_range(h->delayed_pic, h1->delayed_pic, MAX_DELAYED_PIC_COUNT+2,
s, s1); |
| 1104 | 1147 |
| 1105 h->last_slice_type = h1->last_slice_type; | 1148 h->last_slice_type = h1->last_slice_type; |
| 1106 | 1149 |
| 1107 if(!s->current_picture_ptr) return 0; | 1150 if(!s->current_picture_ptr) return 0; |
| 1108 | 1151 |
| 1109 if(!s->dropable) { | 1152 if(!s->dropable) { |
| (...skipping 249 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1359 AV_COPY128(top_border, src_y + 16*linesize); | 1402 AV_COPY128(top_border, src_y + 16*linesize); |
| 1360 | 1403 |
| 1361 if(simple || !CONFIG_GRAY || !(s->flags&CODEC_FLAG_GRAY)){ | 1404 if(simple || !CONFIG_GRAY || !(s->flags&CODEC_FLAG_GRAY)){ |
| 1362 AV_COPY64(top_border+16, src_cb+8*uvlinesize); | 1405 AV_COPY64(top_border+16, src_cb+8*uvlinesize); |
| 1363 AV_COPY64(top_border+24, src_cr+8*uvlinesize); | 1406 AV_COPY64(top_border+24, src_cr+8*uvlinesize); |
| 1364 } | 1407 } |
| 1365 } | 1408 } |
| 1366 | 1409 |
| 1367 static inline void xchg_mb_border(H264Context *h, uint8_t *src_y, uint8_t *src_c
b, uint8_t *src_cr, int linesize, int uvlinesize, int xchg, int simple){ | 1410 static inline void xchg_mb_border(H264Context *h, uint8_t *src_y, uint8_t *src_c
b, uint8_t *src_cr, int linesize, int uvlinesize, int xchg, int simple){ |
| 1368 MpegEncContext * const s = &h->s; | 1411 MpegEncContext * const s = &h->s; |
| 1369 int temp8, i; | |
| 1370 uint64_t temp64; | |
| 1371 int deblock_left; | 1412 int deblock_left; |
| 1372 int deblock_top; | 1413 int deblock_top; |
| 1373 int mb_xy; | |
| 1374 int top_idx = 1; | 1414 int top_idx = 1; |
| 1375 uint8_t *top_border_m1; | 1415 uint8_t *top_border_m1; |
| 1376 uint8_t *top_border; | 1416 uint8_t *top_border; |
| 1377 | 1417 |
| 1378 if(!simple && FRAME_MBAFF){ | 1418 if(!simple && FRAME_MBAFF){ |
| 1379 if(s->mb_y&1){ | 1419 if(s->mb_y&1){ |
| 1380 if(!MB_MBAFF) | 1420 if(!MB_MBAFF) |
| 1381 return; | 1421 return; |
| 1382 }else{ | 1422 }else{ |
| 1383 top_idx = MB_MBAFF ? 0 : 1; | 1423 top_idx = MB_MBAFF ? 0 : 1; |
| 1384 } | 1424 } |
| 1385 } | 1425 } |
| 1386 | 1426 |
| 1387 if(h->deblocking_filter == 2) { | 1427 if(h->deblocking_filter == 2) { |
| 1388 mb_xy = h->mb_xy; | 1428 deblock_left = h->left_type[0]; |
| 1389 deblock_left = h->slice_table[mb_xy] == h->slice_table[mb_xy - 1]; | 1429 deblock_top = h->top_type; |
| 1390 deblock_top = h->slice_table[mb_xy] == h->slice_table[h->top_mb_xy]; | |
| 1391 } else { | 1430 } else { |
| 1392 deblock_left = (s->mb_x > 0); | 1431 deblock_left = (s->mb_x > 0); |
| 1393 deblock_top = (s->mb_y > !!MB_FIELD); | 1432 deblock_top = (s->mb_y > !!MB_FIELD); |
| 1394 } | 1433 } |
| 1395 | 1434 |
| 1396 src_y -= linesize + 1; | 1435 src_y -= linesize + 1; |
| 1397 src_cb -= uvlinesize + 1; | 1436 src_cb -= uvlinesize + 1; |
| 1398 src_cr -= uvlinesize + 1; | 1437 src_cr -= uvlinesize + 1; |
| 1399 | 1438 |
| 1400 top_border_m1 = h->top_borders[top_idx][s->mb_x-1]; | 1439 top_border_m1 = h->top_borders[top_idx][s->mb_x-1]; |
| (...skipping 262 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1663 uint8_t * const ptr= dest[(i&4)>>2] + block_offset[i
]; | 1702 uint8_t * const ptr= dest[(i&4)>>2] + block_offset[i
]; |
| 1664 ff_svq3_add_idct_c(ptr, h->mb + i*16, uvlinesize, ff
_h264_chroma_qp[s->qscale + 12] - 12, 2); | 1703 ff_svq3_add_idct_c(ptr, h->mb + i*16, uvlinesize, ff
_h264_chroma_qp[s->qscale + 12] - 12, 2); |
| 1665 } | 1704 } |
| 1666 } | 1705 } |
| 1667 } | 1706 } |
| 1668 } | 1707 } |
| 1669 } | 1708 } |
| 1670 } | 1709 } |
| 1671 if(h->cbp || IS_INTRA(mb_type)) | 1710 if(h->cbp || IS_INTRA(mb_type)) |
| 1672 s->dsp.clear_blocks(h->mb); | 1711 s->dsp.clear_blocks(h->mb); |
| 1673 | |
| 1674 if(h->deblocking_filter && 0) { | |
| 1675 backup_mb_border(h, dest_y, dest_cb, dest_cr, linesize, uvlinesize, simp
le); | |
| 1676 fill_filter_caches(h, mb_type); //FIXME don't fill stuff which isn't use
d by filter_mb | |
| 1677 h->chroma_qp[0] = get_chroma_qp(h, 0, s->current_picture.qscale_table[mb
_xy]); | |
| 1678 h->chroma_qp[1] = get_chroma_qp(h, 1, s->current_picture.qscale_table[mb
_xy]); | |
| 1679 if (!simple && FRAME_MBAFF) { | |
| 1680 ff_h264_filter_mb (h, mb_x, mb_y, dest_y, dest_cb, dest_cr, line
size, uvlinesize); | |
| 1681 } else { | |
| 1682 ff_h264_filter_mb_fast(h, mb_x, mb_y, dest_y, dest_cb, dest_cr, line
size, uvlinesize); | |
| 1683 } | |
| 1684 } | |
| 1685 } | 1712 } |
| 1686 | 1713 |
| 1687 /** | 1714 /** |
| 1688 * Process a macroblock; this case avoids checks for expensive uncommon cases. | 1715 * Process a macroblock; this case avoids checks for expensive uncommon cases. |
| 1689 */ | 1716 */ |
| 1690 static void hl_decode_mb_simple(H264Context *h){ | 1717 static void hl_decode_mb_simple(H264Context *h){ |
| 1691 hl_decode_mb_internal(h, 1); | 1718 hl_decode_mb_internal(h, 1); |
| 1692 } | 1719 } |
| 1693 | 1720 |
| 1694 /** | 1721 /** |
| (...skipping 27 matching lines...) Expand all Loading... |
| 1722 chroma_def = 1<<h->chroma_log2_weight_denom; | 1749 chroma_def = 1<<h->chroma_log2_weight_denom; |
| 1723 | 1750 |
| 1724 for(list=0; list<2; list++){ | 1751 for(list=0; list<2; list++){ |
| 1725 h->luma_weight_flag[list] = 0; | 1752 h->luma_weight_flag[list] = 0; |
| 1726 h->chroma_weight_flag[list] = 0; | 1753 h->chroma_weight_flag[list] = 0; |
| 1727 for(i=0; i<h->ref_count[list]; i++){ | 1754 for(i=0; i<h->ref_count[list]; i++){ |
| 1728 int luma_weight_flag, chroma_weight_flag; | 1755 int luma_weight_flag, chroma_weight_flag; |
| 1729 | 1756 |
| 1730 luma_weight_flag= get_bits1(&s->gb); | 1757 luma_weight_flag= get_bits1(&s->gb); |
| 1731 if(luma_weight_flag){ | 1758 if(luma_weight_flag){ |
| 1732 h->luma_weight[list][i]= get_se_golomb(&s->gb); | 1759 h->luma_weight[i][list][0]= get_se_golomb(&s->gb); |
| 1733 h->luma_offset[list][i]= get_se_golomb(&s->gb); | 1760 h->luma_weight[i][list][1]= get_se_golomb(&s->gb); |
| 1734 if( h->luma_weight[list][i] != luma_def | 1761 if( h->luma_weight[i][list][0] != luma_def |
| 1735 || h->luma_offset[list][i] != 0) { | 1762 || h->luma_weight[i][list][1] != 0) { |
| 1736 h->use_weight= 1; | 1763 h->use_weight= 1; |
| 1737 h->luma_weight_flag[list]= 1; | 1764 h->luma_weight_flag[list]= 1; |
| 1738 } | 1765 } |
| 1739 }else{ | 1766 }else{ |
| 1740 h->luma_weight[list][i]= luma_def; | 1767 h->luma_weight[i][list][0]= luma_def; |
| 1741 h->luma_offset[list][i]= 0; | 1768 h->luma_weight[i][list][1]= 0; |
| 1742 } | 1769 } |
| 1743 | 1770 |
| 1744 if(CHROMA){ | 1771 if(CHROMA){ |
| 1745 chroma_weight_flag= get_bits1(&s->gb); | 1772 chroma_weight_flag= get_bits1(&s->gb); |
| 1746 if(chroma_weight_flag){ | 1773 if(chroma_weight_flag){ |
| 1747 int j; | 1774 int j; |
| 1748 for(j=0; j<2; j++){ | 1775 for(j=0; j<2; j++){ |
| 1749 h->chroma_weight[list][i][j]= get_se_golomb(&s->gb); | 1776 h->chroma_weight[i][list][j][0]= get_se_golomb(&s->gb); |
| 1750 h->chroma_offset[list][i][j]= get_se_golomb(&s->gb); | 1777 h->chroma_weight[i][list][j][1]= get_se_golomb(&s->gb); |
| 1751 if( h->chroma_weight[list][i][j] != chroma_def | 1778 if( h->chroma_weight[i][list][j][0] != chroma_def |
| 1752 || h->chroma_offset[list][i][j] != 0) { | 1779 || h->chroma_weight[i][list][j][1] != 0) { |
| 1753 h->use_weight_chroma= 1; | 1780 h->use_weight_chroma= 1; |
| 1754 h->chroma_weight_flag[list]= 1; | 1781 h->chroma_weight_flag[list]= 1; |
| 1755 } | 1782 } |
| 1756 } | 1783 } |
| 1757 }else{ | 1784 }else{ |
| 1758 int j; | 1785 int j; |
| 1759 for(j=0; j<2; j++){ | 1786 for(j=0; j<2; j++){ |
| 1760 h->chroma_weight[list][i][j]= chroma_def; | 1787 h->chroma_weight[i][list][j][0]= chroma_def; |
| 1761 h->chroma_offset[list][i][j]= 0; | 1788 h->chroma_weight[i][list][j][1]= 0; |
| 1762 } | 1789 } |
| 1763 } | 1790 } |
| 1764 } | 1791 } |
| 1765 } | 1792 } |
| 1766 if(h->slice_type_nos != FF_B_TYPE) break; | 1793 if(h->slice_type_nos != FF_B_TYPE) break; |
| 1767 } | 1794 } |
| 1768 h->use_weight= h->use_weight || h->use_weight_chroma; | 1795 h->use_weight= h->use_weight || h->use_weight_chroma; |
| 1769 return 0; | 1796 return 0; |
| 1770 } | 1797 } |
| 1771 | 1798 |
| (...skipping 17 matching lines...) Expand all Loading... |
| 1789 h->use_weight= 2; | 1816 h->use_weight= 2; |
| 1790 h->use_weight_chroma= 2; | 1817 h->use_weight_chroma= 2; |
| 1791 h->luma_log2_weight_denom= 5; | 1818 h->luma_log2_weight_denom= 5; |
| 1792 h->chroma_log2_weight_denom= 5; | 1819 h->chroma_log2_weight_denom= 5; |
| 1793 | 1820 |
| 1794 for(ref0=0; ref0 < h->ref_count[0]; ref0++){ | 1821 for(ref0=0; ref0 < h->ref_count[0]; ref0++){ |
| 1795 int poc0 = h->ref_list[0][ref0].poc; | 1822 int poc0 = h->ref_list[0][ref0].poc; |
| 1796 for(ref1=0; ref1 < h->ref_count[1]; ref1++){ | 1823 for(ref1=0; ref1 < h->ref_count[1]; ref1++){ |
| 1797 int poc1 = h->ref_list[1][ref1].poc; | 1824 int poc1 = h->ref_list[1][ref1].poc; |
| 1798 int td = av_clip(poc1 - poc0, -128, 127); | 1825 int td = av_clip(poc1 - poc0, -128, 127); |
| 1826 h->implicit_weight[ref0][ref1] = 32; |
| 1799 if(td){ | 1827 if(td){ |
| 1800 int tb = av_clip(cur_poc - poc0, -128, 127); | 1828 int tb = av_clip(cur_poc - poc0, -128, 127); |
| 1801 int tx = (16384 + (FFABS(td) >> 1)) / td; | 1829 int tx = (16384 + (FFABS(td) >> 1)) / td; |
| 1802 int dist_scale_factor = av_clip((tb*tx + 32) >> 6, -1024, 1023)
>> 2; | 1830 int dist_scale_factor = (tb*tx + 32) >> 8; |
| 1803 if(dist_scale_factor < -64 || dist_scale_factor > 128) | 1831 if(dist_scale_factor >= -64 && dist_scale_factor <= 128) |
| 1804 h->implicit_weight[ref0][ref1] = 32; | |
| 1805 else | |
| 1806 h->implicit_weight[ref0][ref1] = 64 - dist_scale_factor; | 1832 h->implicit_weight[ref0][ref1] = 64 - dist_scale_factor; |
| 1807 }else | 1833 } |
| 1808 h->implicit_weight[ref0][ref1] = 32; | |
| 1809 } | 1834 } |
| 1810 } | 1835 } |
| 1811 } | 1836 } |
| 1812 | 1837 |
| 1813 /** | 1838 /** |
| 1814 * instantaneous decoder refresh. | 1839 * instantaneous decoder refresh. |
| 1815 */ | 1840 */ |
| 1816 static void idr(H264Context *h){ | 1841 static void idr(H264Context *h){ |
| 1817 ff_h264_remove_all_refs(h); | 1842 ff_h264_remove_all_refs(h); |
| 1818 h->prev_frame_num= 0; | 1843 h->prev_frame_num= 0; |
| (...skipping 280 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2099 | 2124 |
| 2100 slice_type= golomb_to_pict_type[ slice_type ]; | 2125 slice_type= golomb_to_pict_type[ slice_type ]; |
| 2101 if (slice_type == FF_I_TYPE | 2126 if (slice_type == FF_I_TYPE |
| 2102 || (h0->current_slice != 0 && slice_type == h0->last_slice_type) ) { | 2127 || (h0->current_slice != 0 && slice_type == h0->last_slice_type) ) { |
| 2103 default_ref_list_done = 1; | 2128 default_ref_list_done = 1; |
| 2104 } | 2129 } |
| 2105 h->slice_type= slice_type; | 2130 h->slice_type= slice_type; |
| 2106 h->slice_type_nos= slice_type & 3; | 2131 h->slice_type_nos= slice_type & 3; |
| 2107 | 2132 |
| 2108 s->pict_type= h->slice_type; // to make a few old functions happy, it's wron
g though | 2133 s->pict_type= h->slice_type; // to make a few old functions happy, it's wron
g though |
| 2109 if (s->pict_type == FF_B_TYPE && s0->last_picture_ptr == NULL) { | |
| 2110 av_log(h->s.avctx, AV_LOG_ERROR, | |
| 2111 "B picture before any references, skipping\n"); | |
| 2112 return -1; | |
| 2113 } | |
| 2114 | 2134 |
| 2115 pps_id= get_ue_golomb(&s->gb); | 2135 pps_id= get_ue_golomb(&s->gb); |
| 2116 if(pps_id>=MAX_PPS_COUNT){ | 2136 if(pps_id>=MAX_PPS_COUNT){ |
| 2117 av_log(h->s.avctx, AV_LOG_ERROR, "pps_id out of range\n"); | 2137 av_log(h->s.avctx, AV_LOG_ERROR, "pps_id out of range\n"); |
| 2118 return -1; | 2138 return -1; |
| 2119 } | 2139 } |
| 2120 if(!h0->pps_buffers[pps_id]) { | 2140 if(!h0->pps_buffers[pps_id]) { |
| 2121 av_log(h->s.avctx, AV_LOG_ERROR, "non-existing PPS %u referenced\n", pps
_id); | 2141 av_log(h->s.avctx, AV_LOG_ERROR, "non-existing PPS %u referenced\n", pps
_id); |
| 2122 return -1; | 2142 return -1; |
| 2123 } | 2143 } |
| 2124 h->pps= *h0->pps_buffers[pps_id]; | 2144 h->pps= *h0->pps_buffers[pps_id]; |
| 2125 | 2145 |
| 2126 if(!h0->sps_buffers[h->pps.sps_id]) { | 2146 if(!h0->sps_buffers[h->pps.sps_id]) { |
| 2127 av_log(h->s.avctx, AV_LOG_ERROR, "non-existing SPS %u referenced\n", h->
pps.sps_id); | 2147 av_log(h->s.avctx, AV_LOG_ERROR, "non-existing SPS %u referenced\n", h->
pps.sps_id); |
| 2128 return -1; | 2148 return -1; |
| 2129 } | 2149 } |
| 2130 h->sps = *h0->sps_buffers[h->pps.sps_id]; | 2150 h->sps = *h0->sps_buffers[h->pps.sps_id]; |
| 2131 | 2151 |
| 2132 if(h == h0 && h->dequant_coeff_pps != pps_id){ | 2152 if(h == h0 && h->dequant_coeff_pps != pps_id){ |
| 2133 h->dequant_coeff_pps = pps_id; | 2153 h->dequant_coeff_pps = pps_id; |
| 2134 init_dequant_tables(h); | 2154 init_dequant_tables(h); |
| 2135 } | 2155 } |
| 2136 | 2156 |
| 2137 s->mb_width= h->sps.mb_width; | 2157 s->mb_width= h->sps.mb_width; |
| 2138 s->mb_height= h->sps.mb_height * (2 - h->sps.frame_mbs_only_flag); | 2158 s->mb_height= h->sps.mb_height * (2 - h->sps.frame_mbs_only_flag); |
| 2139 | 2159 |
| 2140 h->b_stride= s->mb_width*4; | 2160 h->b_stride= s->mb_width*4; |
| 2141 h->b8_stride= s->mb_width*2; | |
| 2142 | 2161 |
| 2143 s->width = 16*s->mb_width - 2*FFMIN(h->sps.crop_right, 7); | 2162 s->width = 16*s->mb_width - 2*FFMIN(h->sps.crop_right, 7); |
| 2144 if(h->sps.frame_mbs_only_flag) | 2163 if(h->sps.frame_mbs_only_flag) |
| 2145 s->height= 16*s->mb_height - 2*FFMIN(h->sps.crop_bottom, 7); | 2164 s->height= 16*s->mb_height - 2*FFMIN(h->sps.crop_bottom, 7); |
| 2146 else | 2165 else |
| 2147 s->height= 16*s->mb_height - 4*FFMIN(h->sps.crop_bottom, 3); | 2166 s->height= 16*s->mb_height - 4*FFMIN(h->sps.crop_bottom, 3); |
| 2148 | 2167 |
| 2149 if (s->context_initialized | 2168 if (s->context_initialized |
| 2150 && ( s->width != s->avctx->width || s->height != s->avctx->height)) { | 2169 && ( s->width != s->avctx->width || s->height != s->avctx->height)) { |
| 2151 if(h != h0 || s->avctx->active_thread_type&FF_THREAD_FRAME) { | 2170 if(h != h0 || s->avctx->active_thread_type&FF_THREAD_FRAME) { |
| (...skipping 16 matching lines...) Expand all Loading... |
| 2168 if(h->sps.video_signal_type_present_flag){ | 2187 if(h->sps.video_signal_type_present_flag){ |
| 2169 s->avctx->color_range = h->sps.full_range ? AVCOL_RANGE_JPEG : AVCOL
_RANGE_MPEG; | 2188 s->avctx->color_range = h->sps.full_range ? AVCOL_RANGE_JPEG : AVCOL
_RANGE_MPEG; |
| 2170 if(h->sps.colour_description_present_flag){ | 2189 if(h->sps.colour_description_present_flag){ |
| 2171 s->avctx->color_primaries = h->sps.color_primaries; | 2190 s->avctx->color_primaries = h->sps.color_primaries; |
| 2172 s->avctx->color_trc = h->sps.color_trc; | 2191 s->avctx->color_trc = h->sps.color_trc; |
| 2173 s->avctx->colorspace = h->sps.colorspace; | 2192 s->avctx->colorspace = h->sps.colorspace; |
| 2174 } | 2193 } |
| 2175 } | 2194 } |
| 2176 | 2195 |
| 2177 if(h->sps.timing_info_present_flag){ | 2196 if(h->sps.timing_info_present_flag){ |
| 2178 s->avctx->time_base= (AVRational){h->sps.num_units_in_tick, h->sps.t
ime_scale}; | 2197 int64_t den= h->sps.time_scale; |
| 2179 if(h->x264_build > 0 && h->x264_build < 44) | 2198 if(h->x264_build < 44U) |
| 2180 s->avctx->time_base.den *= 2; | 2199 den *= 2; |
| 2181 av_reduce(&s->avctx->time_base.num, &s->avctx->time_base.den, | 2200 av_reduce(&s->avctx->time_base.num, &s->avctx->time_base.den, |
| 2182 s->avctx->time_base.num, s->avctx->time_base.den, 1<<30); | 2201 h->sps.num_units_in_tick, den, 1<<30); |
| 2183 } | 2202 } |
| 2184 s->avctx->pix_fmt = s->avctx->get_format(s->avctx, s->avctx->codec->pix_
fmts); | 2203 s->avctx->pix_fmt = s->avctx->get_format(s->avctx, s->avctx->codec->pix_
fmts); |
| 2185 s->avctx->hwaccel = ff_find_hwaccel(s->avctx->codec->id, s->avctx->pix_f
mt); | 2204 s->avctx->hwaccel = ff_find_hwaccel(s->avctx->codec->id, s->avctx->pix_f
mt); |
| 2186 | 2205 |
| 2187 if (MPV_common_init(s) < 0) | 2206 if (MPV_common_init(s) < 0) |
| 2188 return -1; | 2207 return -1; |
| 2189 s->first_field = 0; | 2208 s->first_field = 0; |
| 2190 h->prev_interlaced_frame = 1; | 2209 h->prev_interlaced_frame = 1; |
| 2191 | 2210 |
| 2192 init_scan_tables(h); | 2211 init_scan_tables(h); |
| 2193 ff_h264_alloc_tables(h); | 2212 ff_h264_alloc_tables(h); |
| 2194 | 2213 |
| 2195 if (!HAVE_THREADS || !(s->avctx->active_thread_type&FF_THREAD_SLICE)) { | 2214 if (!HAVE_THREADS || !(s->avctx->active_thread_type&FF_THREAD_SLICE)) { |
| 2196 if (context_init(h) < 0) | 2215 if (context_init(h) < 0) |
| 2197 return -1; | 2216 return -1; |
| 2198 } else { | 2217 } else { |
| 2199 for(i = 1; i < s->avctx->thread_count; i++) { | 2218 for(i = 1; i < s->avctx->thread_count; i++) { |
| 2200 H264Context *c; | 2219 H264Context *c; |
| 2201 c = h->thread_context[i] = av_malloc(sizeof(H264Context)); | 2220 c = h->thread_context[i] = av_malloc(sizeof(H264Context)); |
| 2202 memcpy(c, h->s.thread_context[i], sizeof(MpegEncContext)); | 2221 memcpy(c, h->s.thread_context[i], sizeof(MpegEncContext)); |
| 2203 memset(&c->s + 1, 0, sizeof(H264Context) - sizeof(MpegEncContext
)); | 2222 memset(&c->s + 1, 0, sizeof(H264Context) - sizeof(MpegEncContext
)); |
| 2204 c->sps = h->sps; | 2223 c->sps = h->sps; |
| 2205 c->pps = h->pps; | 2224 c->pps = h->pps; |
| 2206 init_scan_tables(c); | 2225 init_scan_tables(c); |
| 2207 clone_tables(c, h); | 2226 clone_tables(c, h, i); |
| 2208 } | 2227 } |
| 2209 | 2228 |
| 2210 for(i = 0; i < s->avctx->thread_count; i++) | 2229 for(i = 0; i < s->avctx->thread_count; i++) |
| 2211 if(context_init(h->thread_context[i]) < 0) | 2230 if(context_init(h->thread_context[i]) < 0) |
| 2212 return -1; | 2231 return -1; |
| 2213 } | 2232 } |
| 2214 } | 2233 } |
| 2215 | 2234 |
| 2216 h->frame_num= get_bits(&s->gb, h->sps.log2_max_frame_num); | 2235 h->frame_num= get_bits(&s->gb, h->sps.log2_max_frame_num); |
| 2217 | 2236 |
| (...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2388 if(h->slice_type_nos==FF_B_TYPE){ | 2407 if(h->slice_type_nos==FF_B_TYPE){ |
| 2389 s->next_picture_ptr= &h->ref_list[1][0]; | 2408 s->next_picture_ptr= &h->ref_list[1][0]; |
| 2390 ff_copy_picture(&s->next_picture, s->next_picture_ptr); | 2409 ff_copy_picture(&s->next_picture, s->next_picture_ptr); |
| 2391 } | 2410 } |
| 2392 | 2411 |
| 2393 */ | 2412 */ |
| 2394 | 2413 |
| 2395 if( (h->pps.weighted_pred && h->slice_type_nos == FF_P_TYPE ) | 2414 if( (h->pps.weighted_pred && h->slice_type_nos == FF_P_TYPE ) |
| 2396 || (h->pps.weighted_bipred_idc==1 && h->slice_type_nos== FF_B_TYPE ) ) | 2415 || (h->pps.weighted_bipred_idc==1 && h->slice_type_nos== FF_B_TYPE ) ) |
| 2397 pred_weight_table(h); | 2416 pred_weight_table(h); |
| 2398 else if(h->pps.weighted_bipred_idc==2 && h->slice_type_nos== FF_B_TYPE) | 2417 else if(h->pps.weighted_bipred_idc==2 && h->slice_type_nos== FF_B_TYPE){ |
| 2399 implicit_weight_table(h); | 2418 implicit_weight_table(h); |
| 2400 else { | 2419 }else { |
| 2401 h->use_weight = 0; | 2420 h->use_weight = 0; |
| 2402 for (i = 0; i < 2; i++) { | 2421 for (i = 0; i < 2; i++) { |
| 2403 h->luma_weight_flag[i] = 0; | 2422 h->luma_weight_flag[i] = 0; |
| 2404 h->chroma_weight_flag[i] = 0; | 2423 h->chroma_weight_flag[i] = 0; |
| 2405 } | 2424 } |
| 2406 } | 2425 } |
| 2407 | 2426 |
| 2408 if(h->nal_ref_idc) | 2427 if(h->nal_ref_idc) |
| 2409 ff_h264_decode_ref_pic_marking(h0, &s->gb); | 2428 ff_h264_decode_ref_pic_marking(h0, &s->gb); |
| 2410 | 2429 |
| (...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2573 static void loop_filter(H264Context *h){ | 2592 static void loop_filter(H264Context *h){ |
| 2574 MpegEncContext * const s = &h->s; | 2593 MpegEncContext * const s = &h->s; |
| 2575 uint8_t *dest_y, *dest_cb, *dest_cr; | 2594 uint8_t *dest_y, *dest_cb, *dest_cr; |
| 2576 int linesize, uvlinesize, mb_x, mb_y; | 2595 int linesize, uvlinesize, mb_x, mb_y; |
| 2577 const int end_mb_y= s->mb_y + FRAME_MBAFF; | 2596 const int end_mb_y= s->mb_y + FRAME_MBAFF; |
| 2578 const int old_slice_type= h->slice_type; | 2597 const int old_slice_type= h->slice_type; |
| 2579 | 2598 |
| 2580 if(h->deblocking_filter) { | 2599 if(h->deblocking_filter) { |
| 2581 for(mb_x= 0; mb_x<s->mb_width; mb_x++){ | 2600 for(mb_x= 0; mb_x<s->mb_width; mb_x++){ |
| 2582 for(mb_y=end_mb_y - FRAME_MBAFF; mb_y<= end_mb_y; mb_y++){ | 2601 for(mb_y=end_mb_y - FRAME_MBAFF; mb_y<= end_mb_y; mb_y++){ |
| 2583 int list, mb_xy, mb_type; | 2602 int mb_xy, mb_type; |
| 2584 mb_xy = h->mb_xy = mb_x + mb_y*s->mb_stride; | 2603 mb_xy = h->mb_xy = mb_x + mb_y*s->mb_stride; |
| 2585 h->slice_num= h->slice_table[mb_xy]; | 2604 h->slice_num= h->slice_table[mb_xy]; |
| 2586 mb_type= s->current_picture.mb_type[mb_xy]; | 2605 mb_type= s->current_picture.mb_type[mb_xy]; |
| 2587 h->list_count= h->list_counts[mb_xy]; | 2606 h->list_count= h->list_counts[mb_xy]; |
| 2588 | 2607 |
| 2589 if(FRAME_MBAFF) | 2608 if(FRAME_MBAFF) |
| 2590 h->mb_mbaff = h->mb_field_decoding_flag = !!IS_INTERLACED(mb
_type); | 2609 h->mb_mbaff = h->mb_field_decoding_flag = !!IS_INTERLACED(mb
_type); |
| 2591 | 2610 |
| 2592 s->mb_x= mb_x; | 2611 s->mb_x= mb_x; |
| 2593 s->mb_y= mb_y; | 2612 s->mb_y= mb_y; |
| (...skipping 24 matching lines...) Expand all Loading... |
| 2618 ff_h264_filter_mb (h, mb_x, mb_y, dest_y, dest_cb, dest_
cr, linesize, uvlinesize); | 2637 ff_h264_filter_mb (h, mb_x, mb_y, dest_y, dest_cb, dest_
cr, linesize, uvlinesize); |
| 2619 } else { | 2638 } else { |
| 2620 ff_h264_filter_mb_fast(h, mb_x, mb_y, dest_y, dest_cb, dest_
cr, linesize, uvlinesize); | 2639 ff_h264_filter_mb_fast(h, mb_x, mb_y, dest_y, dest_cb, dest_
cr, linesize, uvlinesize); |
| 2621 } | 2640 } |
| 2622 } | 2641 } |
| 2623 } | 2642 } |
| 2624 } | 2643 } |
| 2625 h->slice_type= old_slice_type; | 2644 h->slice_type= old_slice_type; |
| 2626 s->mb_x= 0; | 2645 s->mb_x= 0; |
| 2627 s->mb_y= end_mb_y - FRAME_MBAFF; | 2646 s->mb_y= end_mb_y - FRAME_MBAFF; |
| 2647 h->chroma_qp[0] = get_chroma_qp(h, 0, s->qscale); |
| 2648 h->chroma_qp[1] = get_chroma_qp(h, 1, s->qscale); |
| 2649 } |
| 2650 |
| 2651 static void predict_field_decoding_flag(H264Context *h){ |
| 2652 MpegEncContext * const s = &h->s; |
| 2653 const int mb_xy= s->mb_x + s->mb_y*s->mb_stride; |
| 2654 int mb_type = (h->slice_table[mb_xy-1] == h->slice_num) |
| 2655 ? s->current_picture.mb_type[mb_xy-1] |
| 2656 : (h->slice_table[mb_xy-s->mb_stride] == h->slice_num) |
| 2657 ? s->current_picture.mb_type[mb_xy-s->mb_stride] |
| 2658 : 0; |
| 2659 h->mb_mbaff = h->mb_field_decoding_flag = IS_INTERLACED(mb_type) ? 1 : 0; |
| 2628 } | 2660 } |
| 2629 | 2661 |
| 2630 /** | 2662 /** |
| 2631 * Draw edges and report progress for the last MB row. | 2663 * Draw edges and report progress for the last MB row. |
| 2632 */ | 2664 */ |
| 2633 static void decode_finish_row(H264Context *h){ | 2665 static void decode_finish_row(H264Context *h){ |
| 2634 MpegEncContext * const s = &h->s; | 2666 MpegEncContext * const s = &h->s; |
| 2635 int top = 16*(s->mb_y >> FIELD_PICTURE); | 2667 int top = 16*(s->mb_y >> FIELD_PICTURE); |
| 2636 int height = 16 << FRAME_MBAFF; | 2668 int height = 16 << FRAME_MBAFF; |
| 2637 int deblock_border = (16 + 4) << FRAME_MBAFF; | 2669 int deblock_border = (16 + 4) << FRAME_MBAFF; |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2694 if( ret >= 0 && FRAME_MBAFF ) { //FIXME optimal? or let mb_decode de
code 16x32 ? | 2726 if( ret >= 0 && FRAME_MBAFF ) { //FIXME optimal? or let mb_decode de
code 16x32 ? |
| 2695 s->mb_y++; | 2727 s->mb_y++; |
| 2696 | 2728 |
| 2697 ret = ff_h264_decode_mb_cabac(h); | 2729 ret = ff_h264_decode_mb_cabac(h); |
| 2698 | 2730 |
| 2699 if(ret>=0) ff_h264_hl_decode_mb(h); | 2731 if(ret>=0) ff_h264_hl_decode_mb(h); |
| 2700 s->mb_y--; | 2732 s->mb_y--; |
| 2701 } | 2733 } |
| 2702 eos = get_cabac_terminate( &h->cabac ); | 2734 eos = get_cabac_terminate( &h->cabac ); |
| 2703 | 2735 |
| 2736 if((s->workaround_bugs & FF_BUG_TRUNCATED) && h->cabac.bytestream >
h->cabac.bytestream_end + 2){ |
| 2737 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); |
| 2738 return 0; |
| 2739 } |
| 2704 if( ret < 0 || h->cabac.bytestream > h->cabac.bytestream_end + 2) { | 2740 if( ret < 0 || h->cabac.bytestream > h->cabac.bytestream_end + 2) { |
| 2705 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.bytes
tream); | 2741 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.bytes
tream); |
| 2706 ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x, s->m
b_y, (AC_ERROR|DC_ERROR|MV_ERROR)&part_mask); | 2742 ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x, s->m
b_y, (AC_ERROR|DC_ERROR|MV_ERROR)&part_mask); |
| 2707 return -1; | 2743 return -1; |
| 2708 } | 2744 } |
| 2709 | 2745 |
| 2710 if( ++s->mb_x >= s->mb_width ) { | 2746 if( ++s->mb_x >= s->mb_width ) { |
| 2711 s->mb_x = 0; | 2747 s->mb_x = 0; |
| 2712 loop_filter(h); | 2748 loop_filter(h); |
| 2713 decode_finish_row(h); | 2749 decode_finish_row(h); |
| 2714 ++s->mb_y; | 2750 ++s->mb_y; |
| 2715 if(FIELD_OR_MBAFF_PICTURE) { | 2751 if(FIELD_OR_MBAFF_PICTURE) { |
| 2716 ++s->mb_y; | 2752 ++s->mb_y; |
| 2753 if(FRAME_MBAFF && s->mb_y < s->mb_height) |
| 2754 predict_field_decoding_flag(h); |
| 2717 } | 2755 } |
| 2718 } | 2756 } |
| 2719 | 2757 |
| 2720 if( eos || s->mb_y >= s->mb_height ) { | 2758 if( eos || s->mb_y >= s->mb_height ) { |
| 2721 tprintf(s->avctx, "slice end %d %d\n", get_bits_count(&s->gb), s
->gb.size_in_bits); | 2759 tprintf(s->avctx, "slice end %d %d\n", get_bits_count(&s->gb), s
->gb.size_in_bits); |
| 2722 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); | 2760 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); |
| 2723 return 0; | 2761 return 0; |
| 2724 } | 2762 } |
| 2725 } | 2763 } |
| 2726 | 2764 |
| (...skipping 18 matching lines...) Expand all Loading... |
| 2745 return -1; | 2783 return -1; |
| 2746 } | 2784 } |
| 2747 | 2785 |
| 2748 if(++s->mb_x >= s->mb_width){ | 2786 if(++s->mb_x >= s->mb_width){ |
| 2749 s->mb_x=0; | 2787 s->mb_x=0; |
| 2750 loop_filter(h); | 2788 loop_filter(h); |
| 2751 decode_finish_row(h); | 2789 decode_finish_row(h); |
| 2752 ++s->mb_y; | 2790 ++s->mb_y; |
| 2753 if(FIELD_OR_MBAFF_PICTURE) { | 2791 if(FIELD_OR_MBAFF_PICTURE) { |
| 2754 ++s->mb_y; | 2792 ++s->mb_y; |
| 2793 if(FRAME_MBAFF && s->mb_y < s->mb_height) |
| 2794 predict_field_decoding_flag(h); |
| 2755 } | 2795 } |
| 2756 if(s->mb_y >= s->mb_height){ | 2796 if(s->mb_y >= s->mb_height){ |
| 2757 tprintf(s->avctx, "slice end %d %d\n", get_bits_count(&s->gb
), s->gb.size_in_bits); | 2797 tprintf(s->avctx, "slice end %d %d\n", get_bits_count(&s->gb
), s->gb.size_in_bits); |
| 2758 | 2798 |
| 2759 if(get_bits_count(&s->gb) == s->gb.size_in_bits ) { | 2799 if(get_bits_count(&s->gb) == s->gb.size_in_bits ) { |
| 2760 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); | 2800 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); |
| 2761 | 2801 |
| 2762 return 0; | 2802 return 0; |
| 2763 }else{ | 2803 }else{ |
| 2764 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); | 2804 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); |
| (...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2929 buf_index+=3; | 2969 buf_index+=3; |
| 2930 if(buf_index >= next_avc) continue; | 2970 if(buf_index >= next_avc) continue; |
| 2931 } | 2971 } |
| 2932 | 2972 |
| 2933 hx = h->thread_context[context_count]; | 2973 hx = h->thread_context[context_count]; |
| 2934 | 2974 |
| 2935 ptr= ff_h264_decode_nal(hx, buf + buf_index, &dst_length, &consumed, nex
t_avc - buf_index); | 2975 ptr= ff_h264_decode_nal(hx, buf + buf_index, &dst_length, &consumed, nex
t_avc - buf_index); |
| 2936 if (ptr==NULL || dst_length < 0){ | 2976 if (ptr==NULL || dst_length < 0){ |
| 2937 return -1; | 2977 return -1; |
| 2938 } | 2978 } |
| 2979 i= buf_index + consumed; |
| 2980 if((s->workaround_bugs & FF_BUG_AUTODETECT) && i+3<next_avc && |
| 2981 buf[i]==0x00 && buf[i+1]==0x00 && buf[i+2]==0x01 && buf[i+3]==0xE0) |
| 2982 s->workaround_bugs |= FF_BUG_TRUNCATED; |
| 2983 |
| 2984 if(!(s->workaround_bugs & FF_BUG_TRUNCATED)){ |
| 2939 while(ptr[dst_length - 1] == 0 && dst_length > 0) | 2985 while(ptr[dst_length - 1] == 0 && dst_length > 0) |
| 2940 dst_length--; | 2986 dst_length--; |
| 2987 } |
| 2941 bit_length= !dst_length ? 0 : (8*dst_length - ff_h264_decode_rbsp_traili
ng(h, ptr + dst_length - 1)); | 2988 bit_length= !dst_length ? 0 : (8*dst_length - ff_h264_decode_rbsp_traili
ng(h, ptr + dst_length - 1)); |
| 2942 | 2989 |
| 2943 if(s->avctx->debug&FF_DEBUG_STARTCODE){ | 2990 if(s->avctx->debug&FF_DEBUG_STARTCODE){ |
| 2944 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); | 2991 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); |
| 2945 } | 2992 } |
| 2946 | 2993 |
| 2947 if (h->is_avc && (nalsize != consumed) && nalsize){ | 2994 if (h->is_avc && (nalsize != consumed) && nalsize){ |
| 2948 av_log(h->s.avctx, AV_LOG_DEBUG, "AVC: Consumed only %d bytes instea
d of %d\n", consumed, nalsize); | 2995 av_log(h->s.avctx, AV_LOG_DEBUG, "AVC: Consumed only %d bytes instea
d of %d\n", consumed, nalsize); |
| 2949 } | 2996 } |
| 2950 | 2997 |
| (...skipping 185 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3136 h->delayed_pic[i] = h->delayed_pic[i+1]; | 3183 h->delayed_pic[i] = h->delayed_pic[i+1]; |
| 3137 | 3184 |
| 3138 if(out){ | 3185 if(out){ |
| 3139 *data_size = sizeof(AVFrame); | 3186 *data_size = sizeof(AVFrame); |
| 3140 *pict= *(AVFrame*)out; | 3187 *pict= *(AVFrame*)out; |
| 3141 } | 3188 } |
| 3142 | 3189 |
| 3143 return 0; | 3190 return 0; |
| 3144 } | 3191 } |
| 3145 | 3192 |
| 3146 if(h->is_avc && !h->got_avcC) { | |
| 3147 int i, cnt, nalsize; | |
| 3148 unsigned char *p = avctx->extradata; | |
| 3149 if(avctx->extradata_size < 7) { | |
| 3150 av_log(avctx, AV_LOG_ERROR, "avcC too short\n"); | |
| 3151 return -1; | |
| 3152 } | |
| 3153 if(*p != 1) { | |
| 3154 av_log(avctx, AV_LOG_ERROR, "Unknown avcC version %d\n", *p); | |
| 3155 return -1; | |
| 3156 } | |
| 3157 /* sps and pps in the avcC always have length coded with 2 bytes, | |
| 3158 so put a fake nal_length_size = 2 while parsing them */ | |
| 3159 h->nal_length_size = 2; | |
| 3160 // Decode sps from avcC | |
| 3161 cnt = *(p+5) & 0x1f; // Number of sps | |
| 3162 p += 6; | |
| 3163 for (i = 0; i < cnt; i++) { | |
| 3164 nalsize = AV_RB16(p) + 2; | |
| 3165 if(decode_nal_units(h, p, nalsize) < 0) { | |
| 3166 av_log(avctx, AV_LOG_ERROR, "Decoding sps %d from avcC failed\n"
, i); | |
| 3167 return -1; | |
| 3168 } | |
| 3169 p += nalsize; | |
| 3170 } | |
| 3171 // Decode pps from avcC | |
| 3172 cnt = *(p++); // Number of pps | |
| 3173 for (i = 0; i < cnt; i++) { | |
| 3174 nalsize = AV_RB16(p) + 2; | |
| 3175 if(decode_nal_units(h, p, nalsize) != nalsize) { | |
| 3176 av_log(avctx, AV_LOG_ERROR, "Decoding pps %d from avcC failed\n"
, i); | |
| 3177 return -1; | |
| 3178 } | |
| 3179 p += nalsize; | |
| 3180 } | |
| 3181 // Now store right nal length size, that will be use to parse all other
nals | |
| 3182 h->nal_length_size = ((*(((char*)(avctx->extradata))+4))&0x03)+1; | |
| 3183 // Do not reparse avcC | |
| 3184 h->got_avcC = 1; | |
| 3185 } | |
| 3186 | |
| 3187 if(!h->got_avcC && !h->is_avc && s->avctx->extradata_size){ | |
| 3188 if(decode_nal_units(h, s->avctx->extradata, s->avctx->extradata_size) <
0) | |
| 3189 return -1; | |
| 3190 h->got_avcC = 1; | |
| 3191 } | |
| 3192 | |
| 3193 buf_index=decode_nal_units(h, buf, buf_size); | 3193 buf_index=decode_nal_units(h, buf, buf_size); |
| 3194 if(buf_index < 0) | 3194 if(buf_index < 0) |
| 3195 return -1; | 3195 return -1; |
| 3196 | 3196 |
| 3197 if(!(s->flags2 & CODEC_FLAG2_CHUNKS) && !s->current_picture_ptr){ | 3197 if(!(s->flags2 & CODEC_FLAG2_CHUNKS) && !s->current_picture_ptr){ |
| 3198 if (avctx->skip_frame >= AVDISCARD_NONREF || s->hurry_up) return 0; | 3198 if (avctx->skip_frame >= AVDISCARD_NONREF || s->hurry_up) return 0; |
| 3199 av_log(avctx, AV_LOG_ERROR, "no frame!\n"); | 3199 av_log(avctx, AV_LOG_ERROR, "no frame!\n"); |
| 3200 return -1; | 3200 return -1; |
| 3201 } | 3201 } |
| 3202 | 3202 |
| (...skipping 268 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3471 ff_h264_decode_init, | 3471 ff_h264_decode_init, |
| 3472 NULL, | 3472 NULL, |
| 3473 ff_h264_decode_end, | 3473 ff_h264_decode_end, |
| 3474 decode_frame, | 3474 decode_frame, |
| 3475 CODEC_CAP_DR1 | CODEC_CAP_DELAY | CODEC_CAP_HWACCEL_VDPAU, | 3475 CODEC_CAP_DR1 | CODEC_CAP_DELAY | CODEC_CAP_HWACCEL_VDPAU, |
| 3476 .flush= flush_dpb, | 3476 .flush= flush_dpb, |
| 3477 .long_name = NULL_IF_CONFIG_SMALL("H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10
(VDPAU acceleration)"), | 3477 .long_name = NULL_IF_CONFIG_SMALL("H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10
(VDPAU acceleration)"), |
| 3478 .pix_fmts = (const enum PixelFormat[]){PIX_FMT_VDPAU_H264, PIX_FMT_NONE}, | 3478 .pix_fmts = (const enum PixelFormat[]){PIX_FMT_VDPAU_H264, PIX_FMT_NONE}, |
| 3479 }; | 3479 }; |
| 3480 #endif | 3480 #endif |
| OLD | NEW |