* qatar/release/0.7: (96 commits) intfloat_readwrite: fix signed addition overflows smacker: validate channels and sample format. smacker: check buffer size before reading output size smacker: validate number of channels sipr: fix get_bits(0) calls motion_est: make MotionExtContext.map_generation unsigned 4xm: prevent NULL dereference with invalid huffman table 4xmdemux: prevent use of uninitialized memory 4xm: clear FF_INPUT_BUFFER_PADDING_SIZE bytes in temporary buffers ptx: check for out of bound reads tiffdec: fix out of bound reads/writes eacmv: check for out of bound reads eacmv: fix potential pointer arithmetic overflows adpcm: fix out of bound reads due to integer overflow anm: prevent infinite loop avsdemux: check for out of bound writes avs: check for out of bound reads avsdemux: check for corrupted data mxfdec: Fix some buffer overreads caused by the misuse of AVPacket related functions. vaapi: Fix VC-1 decoding (reconstruct bitstream TTFRM correctly). ... Conflicts: libavcodec/adpcm.c libavcodec/bink.c libavcodec/h264.c libavcodec/h264.h libavcodec/h264_cabac.c libavcodec/h264_cavlc.c libavcodec/motion_est_template.c libavcodec/mpegvideo.c libavcodec/nellymoserdec.c libavcodec/ptx.c libavcodec/svq3.c libavcodec/vaapi_vc1.c libavcodec/xan.c libavfilter/vf_scale.c libavformat/4xm.c libavformat/flvdec.c libavformat/mpeg.c tests/ref/fate/motionpixels Merged-by: Michael Niedermayer <michaelni@gmx.at>tags/n0.8.11
| @@ -1760,9 +1760,9 @@ interlaced video, accepts one of the following values: | |||
| @table @option | |||
| @item 0 | |||
| assume bottom field first | |||
| @item 1 | |||
| assume top field first | |||
| @item 1 | |||
| assume bottom field first | |||
| @item -1 | |||
| enable automatic detection | |||
| @end table | |||
| @@ -1360,11 +1360,17 @@ static int adpcm_decode_frame(AVCodecContext *avctx, | |||
| } | |||
| break; | |||
| case CODEC_ID_ADPCM_EA: | |||
| if (buf_size < 12 || AV_RL32(src) > (buf_size - 12)/30*28) { | |||
| src += buf_size; | |||
| break; | |||
| /* Each EA ADPCM frame has a 12-byte header followed by 30-byte pieces, | |||
| each coding 28 stereo samples. */ | |||
| if (buf_size < 12) { | |||
| av_log(avctx, AV_LOG_ERROR, "frame too small\n"); | |||
| return AVERROR(EINVAL); | |||
| } | |||
| samples_in_chunk = AV_RL32(src); | |||
| if (samples_in_chunk / 28 > (buf_size - 12) / 30) { | |||
| av_log(avctx, AV_LOG_ERROR, "invalid frame\n"); | |||
| return AVERROR(EINVAL); | |||
| } | |||
| src += 4; | |||
| current_left_sample = (int16_t)bytestream_get_le16(&src); | |||
| previous_left_sample = (int16_t)bytestream_get_le16(&src); | |||
| @@ -457,8 +457,8 @@ static int read_dcs(AVCodecContext *avctx, GetBitContext *gb, Bundle *b, | |||
| int start_bits, int has_sign) | |||
| { | |||
| int i, j, len, len2, bsize, sign, v, v2; | |||
| int16_t *dst = (int16_t*)b->cur_dec; | |||
| int16_t *dst_end =( int16_t*)b->data_end; | |||
| int16_t *dst = (int16_t*)b->cur_dec; | |||
| int16_t *dst_end = (int16_t*)b->data_end; | |||
| CHECK_READ_VAL(gb, b, len); | |||
| v = get_bits(gb, start_bits - has_sign); | |||
| @@ -108,7 +108,10 @@ int ff_h264_check_intra4x4_pred_mode(H264Context *h){ | |||
| return 0; | |||
| } //FIXME cleanup like check_intra_pred_mode | |||
| static int check_intra_pred_mode(H264Context *h, int mode, int is_chroma){ | |||
| /** | |||
| * checks if the top & left blocks are available if needed & changes the dc mode so it only uses the available blocks. | |||
| */ | |||
| int ff_h264_check_intra_pred_mode(H264Context *h, int mode, int is_chroma){ | |||
| MpegEncContext * const s = &h->s; | |||
| static const int8_t top [7]= {LEFT_DC_PRED8x8, 1,-1,-1}; | |||
| static const int8_t left[7]= { TOP_DC_PRED8x8,-1, 2,-1,DC_128_PRED8x8}; | |||
| @@ -140,23 +143,6 @@ static int check_intra_pred_mode(H264Context *h, int mode, int is_chroma){ | |||
| return mode; | |||
| } | |||
| /** | |||
| * checks if the top & left blocks are available if needed & changes the dc mode so it only uses the available blocks. | |||
| */ | |||
| int ff_h264_check_intra16x16_pred_mode(H264Context *h, int mode) | |||
| { | |||
| return check_intra_pred_mode(h, mode, 0); | |||
| } | |||
| /** | |||
| * checks if the top & left blocks are available if needed & changes the dc mode so it only uses the available blocks. | |||
| */ | |||
| int ff_h264_check_intra_chroma_pred_mode(H264Context *h, int mode) | |||
| { | |||
| return check_intra_pred_mode(h, mode, 1); | |||
| } | |||
| const uint8_t *ff_h264_decode_nal(H264Context *h, const uint8_t *src, int *dst_length, int *consumed, int length){ | |||
| int i, si, di; | |||
| uint8_t *dst; | |||
| @@ -2231,7 +2217,11 @@ static void implicit_weight_table(H264Context *h, int field){ | |||
| } | |||
| if(field < 0){ | |||
| cur_poc = s->current_picture_ptr->poc; | |||
| if (s->picture_structure == PICT_FRAME) { | |||
| cur_poc = s->current_picture_ptr->poc; | |||
| } else { | |||
| cur_poc = s->current_picture_ptr->field_poc[s->picture_structure - 1]; | |||
| } | |||
| if( h->ref_count[0] == 1 && h->ref_count[1] == 1 && !FRAME_MBAFF | |||
| && h->ref_list[0][0].poc + h->ref_list[1][0].poc == 2*cur_poc){ | |||
| h->use_weight= 0; | |||
| @@ -3761,7 +3751,7 @@ static int decode_nal_units(H264Context *h, const uint8_t *buf, int buf_size){ | |||
| case NAL_IDR_SLICE: | |||
| case NAL_SLICE: | |||
| init_get_bits(&hx->s.gb, ptr, bit_length); | |||
| if(!get_ue_golomb(&hx->s.gb)) | |||
| if (!get_ue_golomb(&hx->s.gb)) | |||
| nals_needed = nal_index; | |||
| } | |||
| continue; | |||
| @@ -658,12 +658,7 @@ int ff_h264_check_intra4x4_pred_mode(H264Context *h); | |||
| /** | |||
| * Check if the top & left blocks are available if needed & change the dc mode so it only uses the available blocks. | |||
| */ | |||
| int ff_h264_check_intra16x16_pred_mode(H264Context *h, int mode); | |||
| /** | |||
| * Check if the top & left blocks are available if needed & change the dc mode so it only uses the available blocks. | |||
| */ | |||
| int ff_h264_check_intra_chroma_pred_mode(H264Context *h, int mode); | |||
| int ff_h264_check_intra_pred_mode(H264Context *h, int mode, int is_chroma); | |||
| void ff_h264_write_back_intra_pred_mode(H264Context *h); | |||
| void ff_h264_hl_decode_mb(H264Context *h); | |||
| @@ -2003,14 +2003,14 @@ decode_intra_mb: | |||
| ff_h264_write_back_intra_pred_mode(h); | |||
| if( ff_h264_check_intra4x4_pred_mode(h) < 0 ) return -1; | |||
| } else { | |||
| h->intra16x16_pred_mode= ff_h264_check_intra16x16_pred_mode( h, h->intra16x16_pred_mode ); | |||
| h->intra16x16_pred_mode= ff_h264_check_intra_pred_mode( h, h->intra16x16_pred_mode, 0 ); | |||
| if( h->intra16x16_pred_mode < 0 ) return -1; | |||
| } | |||
| if(decode_chroma){ | |||
| h->chroma_pred_mode_table[mb_xy] = | |||
| pred_mode = decode_cabac_mb_chroma_pre_mode( h ); | |||
| pred_mode= ff_h264_check_intra_chroma_pred_mode( h, pred_mode ); | |||
| pred_mode= ff_h264_check_intra_pred_mode( h, pred_mode, 1 ); | |||
| if( pred_mode < 0 ) return -1; | |||
| h->chroma_pred_mode= pred_mode; | |||
| } else { | |||
| @@ -238,17 +238,18 @@ static inline int pred_non_zero_count(H264Context *h, int n){ | |||
| } | |||
| static av_cold void init_cavlc_level_tab(void){ | |||
| int suffix_length, mask; | |||
| int suffix_length; | |||
| unsigned int i; | |||
| for(suffix_length=0; suffix_length<7; suffix_length++){ | |||
| for(i=0; i<(1<<LEVEL_TAB_BITS); i++){ | |||
| int prefix= LEVEL_TAB_BITS - av_log2(2*i); | |||
| int level_code= (prefix<<suffix_length) + (i>>(LEVEL_TAB_BITS-prefix-1-suffix_length)) - (1<<suffix_length); | |||
| mask= -(level_code&1); | |||
| level_code= (((2+level_code)>>1) ^ mask) - mask; | |||
| if(prefix + 1 + suffix_length <= LEVEL_TAB_BITS){ | |||
| int level_code = (prefix << suffix_length) + | |||
| (i >> (av_log2(i) - suffix_length)) - (1 << suffix_length); | |||
| int mask = -(level_code&1); | |||
| level_code = (((2 + level_code) >> 1) ^ mask) - mask; | |||
| cavlc_level_tab[suffix_length][i][0]= level_code; | |||
| cavlc_level_tab[suffix_length][i][1]= prefix + 1 + suffix_length; | |||
| }else if(prefix + 1 <= LEVEL_TAB_BITS){ | |||
| @@ -735,12 +736,12 @@ decode_intra_mb: | |||
| if( ff_h264_check_intra4x4_pred_mode(h) < 0) | |||
| return -1; | |||
| }else{ | |||
| h->intra16x16_pred_mode= ff_h264_check_intra16x16_pred_mode(h, h->intra16x16_pred_mode); | |||
| h->intra16x16_pred_mode= ff_h264_check_intra_pred_mode(h, h->intra16x16_pred_mode, 0); | |||
| if(h->intra16x16_pred_mode < 0) | |||
| return -1; | |||
| } | |||
| if(decode_chroma){ | |||
| pred_mode= ff_h264_check_intra_chroma_pred_mode(h, get_ue_golomb_31(&s->gb)); | |||
| pred_mode= ff_h264_check_intra_pred_mode(h, get_ue_golomb_31(&s->gb), 1); | |||
| if(pred_mode < 0) | |||
| return -1; | |||
| h->chroma_pred_mode= pred_mode; | |||
| @@ -485,6 +485,7 @@ int ff_h264_decode_picture_parameter_set(H264Context *h, int bit_length){ | |||
| unsigned int pps_id= get_ue_golomb(&s->gb); | |||
| PPS *pps; | |||
| const int qp_bd_offset = 6*(h->sps.bit_depth_luma-8); | |||
| int bits_left; | |||
| if(pps_id >= MAX_PPS_COUNT) { | |||
| av_log(h->s.avctx, AV_LOG_ERROR, "pps_id (%d) out of range\n", pps_id); | |||
| @@ -561,7 +562,9 @@ int ff_h264_decode_picture_parameter_set(H264Context *h, int bit_length){ | |||
| memcpy(pps->scaling_matrix4, h->sps_buffers[pps->sps_id]->scaling_matrix4, sizeof(pps->scaling_matrix4)); | |||
| memcpy(pps->scaling_matrix8, h->sps_buffers[pps->sps_id]->scaling_matrix8, sizeof(pps->scaling_matrix8)); | |||
| if(get_bits_count(&s->gb) < bit_length){ | |||
| bits_left = bit_length - get_bits_count(&s->gb); | |||
| if (bits_left && (bits_left > 8 || | |||
| show_bits(&s->gb, bits_left) != 1 << (bits_left - 1))) { | |||
| pps->transform_8x8_mode= get_bits1(&s->gb); | |||
| decode_scaling_matrices(h, h->sps_buffers[pps->sps_id], pps, 0, pps->scaling_matrix4, pps->scaling_matrix8); | |||
| pps->chroma_qp_index_offset[1]= get_se_golomb(&s->gb); //second_chroma_qp_index_offset | |||
| @@ -52,7 +52,7 @@ static inline int sad_hpel_motion_search(MpegEncContext * s, | |||
| int src_index, int ref_index, | |||
| int size, int h); | |||
| static inline int update_map_generation(MotionEstContext *c) | |||
| static inline unsigned update_map_generation(MotionEstContext *c) | |||
| { | |||
| c->map_generation+= 1<<(ME_MAP_MV_BITS*2); | |||
| if(c->map_generation==0){ | |||
| @@ -158,9 +158,8 @@ static int hpel_motion_search(MpegEncContext * s, | |||
| const int b= score_map[(index+(1<<ME_MAP_SHIFT))&(ME_MAP_SIZE-1)] | |||
| + (mv_penalty[bx - pred_x] + mv_penalty[by+2 - pred_y])*c->penalty_factor; | |||
| #if 1 | |||
| int key; | |||
| int map_generation= c->map_generation; | |||
| unsigned key; | |||
| unsigned map_generation= c->map_generation; | |||
| #ifndef NDEBUG | |||
| uint32_t *map= c->map; | |||
| #endif | |||
| @@ -172,7 +171,6 @@ static int hpel_motion_search(MpegEncContext * s, | |||
| assert(map[(index+1)&(ME_MAP_SIZE-1)] == key); | |||
| key= ((my)<<ME_MAP_MV_BITS) + (mx-1) + map_generation; | |||
| assert(map[(index-1)&(ME_MAP_SIZE-1)] == key); | |||
| #endif | |||
| if(t<=b){ | |||
| CHECK_HALF_MV(0, 1, mx ,my-1) | |||
| if(l<=r){ | |||
| @@ -280,7 +278,7 @@ static int qpel_motion_search(MpegEncContext * s, | |||
| const int mx = *mx_ptr; | |||
| const int my = *my_ptr; | |||
| const int penalty_factor= c->sub_penalty_factor; | |||
| const int map_generation= c->map_generation; | |||
| const unsigned map_generation = c->map_generation; | |||
| const int subpel_quality= c->avctx->me_subpel_quality; | |||
| uint32_t *map= c->map; | |||
| me_cmp_func cmpf, chroma_cmpf; | |||
| @@ -497,7 +495,7 @@ static int qpel_motion_search(MpegEncContext * s, | |||
| #define CHECK_MV(x,y)\ | |||
| {\ | |||
| const int key= ((y)<<ME_MAP_MV_BITS) + (x) + map_generation;\ | |||
| const unsigned key = ((y)<<ME_MAP_MV_BITS) + (x) + map_generation;\ | |||
| const int index= (((y)<<ME_MAP_SHIFT) + (x))&(ME_MAP_SIZE-1);\ | |||
| assert((x) >= xmin);\ | |||
| assert((x) <= xmax);\ | |||
| @@ -525,7 +523,7 @@ static int qpel_motion_search(MpegEncContext * s, | |||
| #define CHECK_MV_DIR(x,y,new_dir)\ | |||
| {\ | |||
| const int key= ((y)<<ME_MAP_MV_BITS) + (x) + map_generation;\ | |||
| const unsigned key = ((y)<<ME_MAP_MV_BITS) + (x) + map_generation;\ | |||
| const int index= (((y)<<ME_MAP_SHIFT) + (x))&(ME_MAP_SIZE-1);\ | |||
| /*printf("check_mv_dir %d %d %d\n", x, y, new_dir);*/\ | |||
| if(map[index]!=key){\ | |||
| @@ -563,13 +561,13 @@ static av_always_inline int small_diamond_search(MpegEncContext * s, int *best, | |||
| int next_dir=-1; | |||
| LOAD_COMMON | |||
| LOAD_COMMON2 | |||
| int map_generation= c->map_generation; | |||
| unsigned map_generation = c->map_generation; | |||
| cmpf= s->dsp.me_cmp[size]; | |||
| chroma_cmpf= s->dsp.me_cmp[size+1]; | |||
| { /* ensure that the best point is in the MAP as h/qpel refinement needs it */ | |||
| const int key= (best[1]<<ME_MAP_MV_BITS) + best[0] + map_generation; | |||
| const unsigned key = (best[1]<<ME_MAP_MV_BITS) + best[0] + map_generation; | |||
| const int index= ((best[1]<<ME_MAP_SHIFT) + best[0])&(ME_MAP_SIZE-1); | |||
| if(map[index]!=key){ //this will be executed only very rarey | |||
| score_map[index]= cmp(s, best[0], best[1], 0, 0, size, h, ref_index, src_index, cmpf, chroma_cmpf, flags); | |||
| @@ -605,7 +603,7 @@ static int funny_diamond_search(MpegEncContext * s, int *best, int dmin, | |||
| int dia_size; | |||
| LOAD_COMMON | |||
| LOAD_COMMON2 | |||
| int map_generation= c->map_generation; | |||
| unsigned map_generation = c->map_generation; | |||
| cmpf= s->dsp.me_cmp[size]; | |||
| chroma_cmpf= s->dsp.me_cmp[size+1]; | |||
| @@ -646,7 +644,7 @@ static int hex_search(MpegEncContext * s, int *best, int dmin, | |||
| me_cmp_func cmpf, chroma_cmpf; | |||
| LOAD_COMMON | |||
| LOAD_COMMON2 | |||
| int map_generation= c->map_generation; | |||
| unsigned map_generation = c->map_generation; | |||
| int x,y,d; | |||
| const int dec= dia_size & (dia_size-1); | |||
| @@ -680,7 +678,7 @@ static int l2s_dia_search(MpegEncContext * s, int *best, int dmin, | |||
| me_cmp_func cmpf, chroma_cmpf; | |||
| LOAD_COMMON | |||
| LOAD_COMMON2 | |||
| int map_generation= c->map_generation; | |||
| unsigned map_generation = c->map_generation; | |||
| int x,y,i,d; | |||
| int dia_size= c->dia_size&0xFF; | |||
| const int dec= dia_size & (dia_size-1); | |||
| @@ -718,7 +716,7 @@ static int umh_search(MpegEncContext * s, int *best, int dmin, | |||
| me_cmp_func cmpf, chroma_cmpf; | |||
| LOAD_COMMON | |||
| LOAD_COMMON2 | |||
| int map_generation= c->map_generation; | |||
| unsigned map_generation = c->map_generation; | |||
| int x,y,x2,y2, i, j, d; | |||
| const int dia_size= c->dia_size&0xFE; | |||
| static const int hex[16][2]={{-4,-2}, {-4,-1}, {-4, 0}, {-4, 1}, {-4, 2}, | |||
| @@ -765,7 +763,7 @@ static int full_search(MpegEncContext * s, int *best, int dmin, | |||
| me_cmp_func cmpf, chroma_cmpf; | |||
| LOAD_COMMON | |||
| LOAD_COMMON2 | |||
| int map_generation= c->map_generation; | |||
| unsigned map_generation = c->map_generation; | |||
| int x,y, d; | |||
| const int dia_size= c->dia_size&0xFF; | |||
| @@ -794,7 +792,7 @@ static int full_search(MpegEncContext * s, int *best, int dmin, | |||
| #define SAB_CHECK_MV(ax,ay)\ | |||
| {\ | |||
| const int key= ((ay)<<ME_MAP_MV_BITS) + (ax) + map_generation;\ | |||
| const unsigned key = ((ay)<<ME_MAP_MV_BITS) + (ax) + map_generation;\ | |||
| const int index= (((ay)<<ME_MAP_SHIFT) + (ax))&(ME_MAP_SIZE-1);\ | |||
| /*printf("sab check %d %d\n", ax, ay);*/\ | |||
| if(map[index]!=key){\ | |||
| @@ -833,7 +831,7 @@ static int sab_diamond_search(MpegEncContext * s, int *best, int dmin, | |||
| int i, j; | |||
| LOAD_COMMON | |||
| LOAD_COMMON2 | |||
| int map_generation= c->map_generation; | |||
| unsigned map_generation = c->map_generation; | |||
| cmpf= s->dsp.me_cmp[size]; | |||
| chroma_cmpf= s->dsp.me_cmp[size+1]; | |||
| @@ -918,7 +916,7 @@ static int var_diamond_search(MpegEncContext * s, int *best, int dmin, | |||
| int dia_size; | |||
| LOAD_COMMON | |||
| LOAD_COMMON2 | |||
| int map_generation= c->map_generation; | |||
| unsigned map_generation = c->map_generation; | |||
| cmpf= s->dsp.me_cmp[size]; | |||
| chroma_cmpf= s->dsp.me_cmp[size+1]; | |||
| @@ -1010,7 +1008,7 @@ static av_always_inline int epzs_motion_search_internal(MpegEncContext * s, int | |||
| int d; ///< the score (cmp + penalty) of any given mv | |||
| int dmin; /*!< the best value of d, i.e. the score | |||
| corresponding to the mv stored in best[]. */ | |||
| int map_generation; | |||
| unsigned map_generation; | |||
| int penalty_factor; | |||
| const int ref_mv_stride= s->mb_stride; //pass as arg FIXME | |||
| const int ref_mv_xy= s->mb_x + s->mb_y*ref_mv_stride; //add to last_mv beforepassing FIXME | |||
| @@ -1138,7 +1136,7 @@ static int epzs_motion_search4(MpegEncContext * s, | |||
| MotionEstContext * const c= &s->me; | |||
| int best[2]={0, 0}; | |||
| int d, dmin; | |||
| int map_generation; | |||
| unsigned map_generation; | |||
| const int penalty_factor= c->penalty_factor; | |||
| const int size=1; | |||
| const int h=8; | |||
| @@ -1198,7 +1196,7 @@ static int epzs_motion_search2(MpegEncContext * s, | |||
| MotionEstContext * const c= &s->me; | |||
| int best[2]={0, 0}; | |||
| int d, dmin; | |||
| int map_generation; | |||
| unsigned map_generation; | |||
| const int penalty_factor= c->penalty_factor; | |||
| const int size=0; //FIXME pass as arg | |||
| const int h=8; | |||
| @@ -27,6 +27,7 @@ | |||
| #include "avcodec.h" | |||
| #include "dsputil.h" | |||
| #include "mathops.h" | |||
| #include "mpegvideo.h" | |||
| #include "mpeg12.h" | |||
| @@ -681,8 +682,7 @@ static void mpeg1_encode_motion(MpegEncContext *s, int val, int f_or_b_code) | |||
| int bit_size = f_or_b_code - 1; | |||
| int range = 1 << bit_size; | |||
| /* modulo encoding */ | |||
| int l= INT_BIT - 5 - bit_size; | |||
| val= (val<<l)>>l; | |||
| val = sign_extend(val, 5 + bit_size); | |||
| if (val >= 0) { | |||
| val--; | |||
| @@ -366,8 +366,8 @@ static int init_duplicate_context(MpegEncContext *s, MpegEncContext *base){ | |||
| int i; | |||
| // edge emu needs blocksize + filter length - 1 (=17x17 for halfpel / 21x21 for h264) | |||
| FF_ALLOCZ_OR_GOTO(s->avctx, s->allocated_edge_emu_buffer, (s->width+64)*2*21*2*2, fail); //(width + edge + align)*interlaced*MBsize*tolerance | |||
| s->edge_emu_buffer= s->allocated_edge_emu_buffer + (s->width+64)*2*21*2; | |||
| FF_ALLOCZ_OR_GOTO(s->avctx, s->edge_emu_buffer, (s->width+64)*2*21*2*2, fail); //(width + edge + align)*interlaced*MBsize*tolerance | |||
| //FIXME should be linesize instead of s->width*2 but that is not known before get_buffer() | |||
| FF_ALLOCZ_OR_GOTO(s->avctx, s->me.scratchpad, (s->width+64)*4*16*2*sizeof(uint8_t), fail) | |||
| @@ -405,7 +405,7 @@ fail: | |||
| static void free_duplicate_context(MpegEncContext *s){ | |||
| if(s==NULL) return; | |||
| av_freep(&s->allocated_edge_emu_buffer); s->edge_emu_buffer= NULL; | |||
| av_freep(&s->edge_emu_buffer); | |||
| av_freep(&s->me.scratchpad); | |||
| s->me.temp= | |||
| s->rd_scratchpad= | |||
| @@ -422,7 +422,6 @@ static void free_duplicate_context(MpegEncContext *s){ | |||
| static void backup_duplicate_context(MpegEncContext *bak, MpegEncContext *src){ | |||
| #define COPY(a) bak->a= src->a | |||
| COPY(allocated_edge_emu_buffer); | |||
| COPY(edge_emu_buffer); | |||
| COPY(me.scratchpad); | |||
| COPY(me.temp); | |||
| @@ -153,7 +153,7 @@ typedef struct MotionEstContext{ | |||
| int best_bits; | |||
| uint32_t *map; ///< map to avoid duplicate evaluations | |||
| uint32_t *score_map; ///< map to store the scores | |||
| int map_generation; | |||
| unsigned map_generation; | |||
| int pre_penalty_factor; | |||
| int penalty_factor; /*!< an estimate of the bits required to | |||
| code a given mv value, e.g. (1,0) takes | |||
| @@ -317,8 +317,7 @@ typedef struct MpegEncContext { | |||
| uint8_t *mbintra_table; ///< used to avoid setting {ac, dc, cbp}-pred stuff to zero on inter MB decoding | |||
| uint8_t *cbp_table; ///< used to store cbp, ac_pred for partitioned decoding | |||
| uint8_t *pred_dir_table; ///< used to store pred_dir for partitioned decoding | |||
| uint8_t *allocated_edge_emu_buffer; | |||
| uint8_t *edge_emu_buffer; ///< points into the middle of allocated_edge_emu_buffer | |||
| uint8_t *edge_emu_buffer; ///< temporary buffer for if MVs point to out-of-frame data | |||
| uint8_t *rd_scratchpad; ///< scratchpad for rate distortion mb decision | |||
| uint8_t *obmc_scratchpad; | |||
| uint8_t *b_scratchpad; ///< scratchpad used for writing into write only buffers | |||
| @@ -157,19 +157,26 @@ static int decode_tag(AVCodecContext * avctx, | |||
| int buf_size = avpkt->size; | |||
| NellyMoserDecodeContext *s = avctx->priv_data; | |||
| int data_max = *data_size; | |||
| int blocks, i; | |||
| int blocks, i, block_size; | |||
| int16_t* samples; | |||
| *data_size = 0; | |||
| samples = (int16_t*)data; | |||
| if (buf_size < avctx->block_align) | |||
| if (buf_size < avctx->block_align) { | |||
| *data_size = 0; | |||
| return buf_size; | |||
| } | |||
| if (buf_size % 64) { | |||
| av_log(avctx, AV_LOG_ERROR, "Tag size %d.\n", buf_size); | |||
| *data_size = 0; | |||
| return buf_size; | |||
| } | |||
| blocks = buf_size / 64; | |||
| block_size = NELLY_SAMPLES * av_get_bytes_per_sample(avctx->sample_fmt); | |||
| blocks = FFMIN(buf_size / 64, *data_size / block_size); | |||
| if (blocks <= 0) { | |||
| av_log(avctx, AV_LOG_ERROR, "Output buffer is too small\n"); | |||
| return AVERROR(EINVAL); | |||
| } | |||
| /* Normal numbers of blocks for sample rates: | |||
| * 8000 Hz - 1 | |||
| * 11025 Hz - 2 | |||
| @@ -183,8 +190,8 @@ static int decode_tag(AVCodecContext * avctx, | |||
| return i > 0 ? i * NELLY_BLOCK_LEN : -1; | |||
| nelly_decode_block(s, &buf[i*NELLY_BLOCK_LEN], s->float_buf); | |||
| s->fmt_conv.float_to_int16(&samples[i*NELLY_SAMPLES], s->float_buf, NELLY_SAMPLES); | |||
| *data_size += NELLY_SAMPLES*sizeof(int16_t); | |||
| } | |||
| *data_size = blocks * block_size; | |||
| return buf_size; | |||
| } | |||
| @@ -60,7 +60,6 @@ static int ptx_decode_frame(AVCodecContext *avctx, void *data, int *data_size, | |||
| avctx->pix_fmt = PIX_FMT_RGB555; | |||
| if (buf_end - buf < offset) | |||
| return AVERROR_INVALIDDATA; | |||
| if (offset != 0x2c) | |||
| @@ -612,7 +612,7 @@ static int svq3_decode_mb(SVQ3Context *svq3, unsigned int mb_type) | |||
| dir = i_mb_type_info[mb_type - 8].pred_mode; | |||
| dir = (dir >> 1) ^ 3*(dir & 1) ^ 1; | |||
| if ((h->intra16x16_pred_mode = ff_h264_check_intra16x16_pred_mode(h, dir)) == -1){ | |||
| if ((h->intra16x16_pred_mode = ff_h264_check_intra_pred_mode(h, dir, 0)) == -1){ | |||
| av_log(h->s.avctx, AV_LOG_ERROR, "check_intra_pred_mode = -1\n"); | |||
| return -1; | |||
| } | |||
| @@ -711,7 +711,7 @@ static int svq3_decode_mb(SVQ3Context *svq3, unsigned int mb_type) | |||
| s->current_picture.mb_type[mb_xy] = mb_type; | |||
| if (IS_INTRA(mb_type)) { | |||
| h->chroma_pred_mode = ff_h264_check_intra_chroma_pred_mode(h, DC_PRED8x8); | |||
| h->chroma_pred_mode = ff_h264_check_intra_pred_mode(h, DC_PRED8x8, 1); | |||
| } | |||
| return 0; | |||
| @@ -555,8 +555,10 @@ static int xan_decode_frame(AVCodecContext *avctx, | |||
| } | |||
| buf_size = buf_end - buf; | |||
| } | |||
| if (s->palettes_count <= 0) | |||
| if (s->palettes_count <= 0) { | |||
| av_log(s->avctx, AV_LOG_ERROR, "No palette found\n"); | |||
| return AVERROR_INVALIDDATA; | |||
| } | |||
| if ((ret = avctx->get_buffer(avctx, &s->current_frame))) { | |||
| av_log(s->avctx, AV_LOG_ERROR, "get_buffer() failed\n"); | |||
| @@ -157,7 +157,7 @@ static int config_input(AVFilterLink *inlink) | |||
| var_values[VAR_OUT_H] = var_values[VAR_OH] = NAN; | |||
| var_values[VAR_A] = (float) inlink->w / inlink->h; | |||
| var_values[VAR_HSUB] = 1<<pad->hsub; | |||
| var_values[VAR_VSUB] = 2<<pad->vsub; | |||
| var_values[VAR_VSUB] = 1<<pad->vsub; | |||
| /* evaluate width and height */ | |||
| av_expr_parse_and_eval(&res, (expr = pad->w_expr), | |||
| @@ -232,9 +232,11 @@ static int config_props(AVFilterLink *outlink) | |||
| if (!scale->sws || !scale->isws[0] || !scale->isws[1]) | |||
| return AVERROR(EINVAL); | |||
| if (inlink->sample_aspect_ratio.num){ | |||
| outlink->sample_aspect_ratio = av_mul_q((AVRational){outlink->h * inlink->w, outlink->w * inlink->h}, inlink->sample_aspect_ratio); | |||
| } else | |||
| if (inlink->sample_aspect_ratio.num) | |||
| outlink->sample_aspect_ratio = av_mul_q((AVRational){outlink->h*inlink->w, | |||
| outlink->w*inlink->h}, | |||
| inlink->sample_aspect_ratio); | |||
| else | |||
| outlink->sample_aspect_ratio = inlink->sample_aspect_ratio; | |||
| return 0; | |||
| @@ -36,8 +36,8 @@ typedef struct { | |||
| int mode; | |||
| /** | |||
| * 0: bottom field first | |||
| * 1: top field first | |||
| * 0: top field first | |||
| * 1: bottom field first | |||
| * -1: auto-detection | |||
| */ | |||
| int parity; | |||
| @@ -195,9 +195,12 @@ static void return_frame(AVFilterContext *ctx, int is_second) | |||
| tff = yadif->parity^1; | |||
| } | |||
| if (is_second) | |||
| if (is_second) { | |||
| yadif->out = avfilter_get_video_buffer(link, AV_PERM_WRITE | AV_PERM_PRESERVE | | |||
| AV_PERM_REUSE, link->w, link->h); | |||
| avfilter_copy_buffer_ref_props(yadif->out, yadif->cur); | |||
| yadif->out->video->interlaced = 0; | |||
| } | |||
| if (!yadif->csp) | |||
| yadif->csp = &av_pix_fmt_descriptors[link->format]; | |||
| @@ -176,7 +176,7 @@ static int fourxm_read_header(AVFormatContext *s, | |||
| sizeof(AudioTrack), | |||
| current_track + 1); | |||
| if (!fourxm->tracks) { | |||
| ret= AVERROR(ENOMEM); | |||
| ret = AVERROR(ENOMEM); | |||
| goto fail; | |||
| } | |||
| memset(&fourxm->tracks[fourxm->track_count], 0, | |||
| @@ -173,8 +173,8 @@ static int parse_keyframes_index(AVFormatContext *s, AVIOContext *ioc, AVStream | |||
| } | |||
| } | |||
| if (timeslen == fileposlen) { | |||
| for(i = 0; i < timeslen; i++) | |||
| if (!ret && timeslen == fileposlen) { | |||
| for (i = 0; i < fileposlen; i++) | |||
| av_add_index_entry(vstream, filepositions[i], times[i]*1000, 0, 0, AVINDEX_KEYFRAME); | |||
| } else | |||
| av_log(s, AV_LOG_WARNING, "Invalid keyframes object, skipping.\n"); | |||
| @@ -397,7 +397,7 @@ int ff_mp4_read_dec_config_descr(AVFormatContext *fc, AVStream *st, AVIOContext | |||
| len = ff_mp4_read_descr(fc, pb, &tag); | |||
| if (tag == MP4DecSpecificDescrTag) { | |||
| av_dlog(fc, "Specific MPEG4 header len=%d\n", len); | |||
| if((uint64_t)len > (1<<30)) | |||
| if (!len || (uint64_t)len > (1<<30)) | |||
| return -1; | |||
| av_free(st->codec->extradata); | |||
| st->codec->extradata = av_mallocz(len + FF_INPUT_BUFFER_PADDING_SIZE); | |||
| @@ -423,7 +423,7 @@ static int mpegps_read_packet(AVFormatContext *s, | |||
| { | |||
| MpegDemuxContext *m = s->priv_data; | |||
| AVStream *st; | |||
| int len, startcode, i, es_type; | |||
| int len, startcode, i, es_type, ret; | |||
| int request_probe= 0; | |||
| enum CodecID codec_id = CODEC_ID_NONE; | |||
| enum AVMediaType type; | |||
| @@ -568,8 +568,7 @@ static int mpegps_read_packet(AVFormatContext *s, | |||
| else if (st->codec->bits_per_coded_sample == 28) | |||
| return AVERROR(EINVAL); | |||
| } | |||
| av_new_packet(pkt, len); | |||
| avio_read(s->pb, pkt->data, pkt->size); | |||
| ret = av_get_packet(s->pb, pkt, len); | |||
| pkt->pts = pts; | |||
| pkt->dts = dts; | |||
| pkt->pos = dummy_pos; | |||
| @@ -578,7 +577,7 @@ static int mpegps_read_packet(AVFormatContext *s, | |||
| pkt->stream_index, pkt->pts / 90000.0, pkt->dts / 90000.0, | |||
| pkt->size); | |||
| return 0; | |||
| return (ret < 0) ? ret : 0; | |||
| } | |||
| static int64_t mpegps_read_dts(AVFormatContext *s, int stream_index, | |||
| @@ -132,6 +132,8 @@ static int sol_read_packet(AVFormatContext *s, | |||
| if (url_feof(s->pb)) | |||
| return AVERROR(EIO); | |||
| ret= av_get_packet(s->pb, pkt, MAX_SIZE); | |||
| if (ret < 0) | |||
| return ret; | |||
| pkt->stream_index = 0; | |||
| /* note: we need to modify the packet size here to handle the last | |||
| @@ -30,13 +30,13 @@ | |||
| #include "intfloat_readwrite.h" | |||
| double av_int2dbl(int64_t v){ | |||
| if(v+v > 0xFFEULL<<52) | |||
| if((uint64_t)v+v > 0xFFEULL<<52) | |||
| return NAN; | |||
| return ldexp(((v&((1LL<<52)-1)) + (1LL<<52)) * (v>>63|1), (v>>52&0x7FF)-1075); | |||
| } | |||
| float av_int2flt(int32_t v){ | |||
| if(v+v > 0xFF000000U) | |||
| if((uint32_t)v+v > 0xFF000000U) | |||
| return NAN; | |||
| return ldexp(((v&0x7FFFFF) + (1<<23)) * (v>>31|1), (v>>23&0xFF)-150); | |||
| } | |||
| @@ -175,7 +175,7 @@ fate-maxis-xa: CMD = md5 -i $(SAMPLES)/maxis-xa/SC2KBUG.XA -f s16le | |||
| FATE_TESTS += fate-mimic | |||
| fate-mimic: CMD = framecrc -idct simple -i $(SAMPLES)/mimic/mimic2-womanloveffmpeg.cam -vsync 0 | |||
| FATE_TESTS += fate-motionpixels | |||
| fate-motionpixels: CMD = framecrc -i $(SAMPLES)/motion-pixels/INTRO-partial.MVI -an -pix_fmt rgb24 | |||
| fate-motionpixels: CMD = framecrc -i $(SAMPLES)/motion-pixels/INTRO-partial.MVI -an -pix_fmt rgb24 -vframes 111 | |||
| FATE_TESTS += fate-mpc7-demux | |||
| fate-mpc7-demux: CMD = crc -i $(SAMPLES)/musepack/inside-mp7.mpc -acodec copy | |||
| FATE_TESTS += fate-mpc8-demux | |||
| @@ -109,4 +109,3 @@ | |||
| 0, 648003, 230400, 0xb343f372 | |||
| 0, 654003, 230400, 0xf7f1e588 | |||
| 0, 660003, 230400, 0x9682bdb2 | |||
| 0, 666003, 230400, 0x009f4640 | |||