X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Fmpegvideo.c;h=4bc32a2316b6685b74784f00a50731ac6c11e384;hb=5f621dd28aa8c7c71edc97c2867cacde346af353;hp=a555f7a1c6f6a38548e2ad7f26b7d38ffb830b26;hpb=54816a3e3f887aff734a88b74b098c9702d28144;p=ffmpeg diff --git a/libavcodec/mpegvideo.c b/libavcodec/mpegvideo.c index a555f7a1c6f..4bc32a2316b 100644 --- a/libavcodec/mpegvideo.c +++ b/libavcodec/mpegvideo.c @@ -153,7 +153,7 @@ int ff_dct_common_init(MpegEncContext *s) return 0; } -void copy_picture(Picture *dst, Picture *src){ +void ff_copy_picture(Picture *dst, Picture *src){ *dst = *src; dst->type= FF_BUFFER_TYPE_COPY; } @@ -236,7 +236,7 @@ int alloc_picture(MpegEncContext *s, Picture *pic, int shared){ /* It might be nicer if the application would keep track of these * but it would require an API change. */ memmove(s->prev_pict_types+1, s->prev_pict_types, PREV_PICT_TYPES_BUFFER_SIZE-1); - s->prev_pict_types[0]= s->pict_type; + s->prev_pict_types[0]= s->dropable ? FF_B_TYPE : s->pict_type; if(pic->age < PREV_PICT_TYPES_BUFFER_SIZE && s->prev_pict_types[pic->age] == FF_B_TYPE) pic->age= INT_MAX; // Skipped MBs in B-frames are quite rare in MPEG-1/2 and it is a bit tricky to skip them anyway. @@ -560,8 +560,8 @@ int MPV_common_init(MpegEncContext *s) s->parse_context.state= -1; if((s->avctx->debug&(FF_DEBUG_VIS_QP|FF_DEBUG_VIS_MB_TYPE)) || (s->avctx->debug_mv)){ s->visualization_buffer[0] = av_malloc((s->mb_width*16 + 2*EDGE_WIDTH) * s->mb_height*16 + 2*EDGE_WIDTH); - s->visualization_buffer[1] = av_malloc((s->mb_width*8 + EDGE_WIDTH) * s->mb_height*8 + EDGE_WIDTH); - s->visualization_buffer[2] = av_malloc((s->mb_width*8 + EDGE_WIDTH) * s->mb_height*8 + EDGE_WIDTH); + s->visualization_buffer[1] = av_malloc((s->mb_width*16 + 2*EDGE_WIDTH) * s->mb_height*16 + 2*EDGE_WIDTH); + s->visualization_buffer[2] = av_malloc((s->mb_width*16 + 2*EDGE_WIDTH) * s->mb_height*16 + 2*EDGE_WIDTH); } s->context_initialized = 1; @@ -722,19 +722,10 @@ void init_rl(RLTable *rl, uint8_t static_store[2][2*MAX_RUN + MAX_LEVEL + 3]) } } -void init_vlc_rl(RLTable *rl, int use_static) +void init_vlc_rl(RLTable *rl) { int i, q; - /* Return if static table is already initialized */ - if(use_static && rl->rl_vlc[0]) - return; - - init_vlc(&rl->vlc, 9, rl->n + 1, - &rl->table_vlc[0][1], 4, 2, - &rl->table_vlc[0][0], 4, 2, use_static); - - for(q=0; q<32; q++){ int qmul= q*2; int qadd= (q-1)|1; @@ -743,10 +734,6 @@ void init_vlc_rl(RLTable *rl, int use_static) qmul=1; qadd=0; } - if(use_static) - rl->rl_vlc[q]= av_mallocz_static(rl->vlc.table_size*sizeof(RL_VLC_ELEM)); - else - rl->rl_vlc[q]= av_malloc(rl->vlc.table_size*sizeof(RL_VLC_ELEM)); for(i=0; ivlc.table_size; i++){ int code= rl->vlc.table[i][0]; int len = rl->vlc.table[i][1]; @@ -891,7 +878,7 @@ alloc: // s->current_picture_ptr->quality= s->new_picture_ptr->quality; s->current_picture_ptr->key_frame= s->pict_type == FF_I_TYPE; - copy_picture(&s->current_picture, s->current_picture_ptr); + ff_copy_picture(&s->current_picture, s->current_picture_ptr); if (s->pict_type != FF_B_TYPE) { s->last_picture_ptr= s->next_picture_ptr; @@ -904,10 +891,10 @@ alloc: s->current_picture_ptr ? s->current_picture_ptr->data[0] : NULL, s->pict_type, s->dropable);*/ - if(s->last_picture_ptr) copy_picture(&s->last_picture, s->last_picture_ptr); - if(s->next_picture_ptr) copy_picture(&s->next_picture, s->next_picture_ptr); + if(s->last_picture_ptr) ff_copy_picture(&s->last_picture, s->last_picture_ptr); + if(s->next_picture_ptr) ff_copy_picture(&s->next_picture, s->next_picture_ptr); - if(s->pict_type != FF_I_TYPE && (s->last_picture_ptr==NULL || s->last_picture_ptr->data[0]==NULL) && !s->dropable){ + if(s->pict_type != FF_I_TYPE && (s->last_picture_ptr==NULL || s->last_picture_ptr->data[0]==NULL) && !s->dropable && s->codec_id != CODEC_ID_H264){ av_log(avctx, AV_LOG_ERROR, "warning: first frame is no keyframe\n"); assert(s->pict_type != FF_B_TYPE); //these should have been dropped if we don't have a reference goto alloc; @@ -928,7 +915,7 @@ alloc: } s->hurry_up= s->avctx->hurry_up; - s->error_resilience= avctx->error_resilience; + s->error_recognition= avctx->error_recognition; /* set dequantizer, we can't do it during init as it might change for mpeg4 and we can't do it in the header decode as init is not called for mpeg4 there yet */ @@ -1177,7 +1164,7 @@ void ff_print_debug_info(MpegEncContext *s, AVFrame *pict){ int mb_y; uint8_t *ptr; int i; - int h_chroma_shift, v_chroma_shift; + int h_chroma_shift, v_chroma_shift, block_height; const int width = s->avctx->width; const int height= s->avctx->height; const int mv_sample_log2= 4 - pict->motion_subsample_log2; @@ -1191,6 +1178,7 @@ void ff_print_debug_info(MpegEncContext *s, AVFrame *pict){ } pict->type= FF_BUFFER_TYPE_COPY; ptr= pict->data[0]; + block_height = 16>>v_chroma_shift; for(mb_y=0; mb_ymb_height; mb_y++){ int mb_x; @@ -1268,9 +1256,9 @@ void ff_print_debug_info(MpegEncContext *s, AVFrame *pict){ if((s->avctx->debug&FF_DEBUG_VIS_QP) && pict->motion_val){ uint64_t c= (pict->qscale_table[mb_index]*128/31) * 0x0101010101010101ULL; int y; - for(y=0; y<8; y++){ - *(uint64_t*)(pict->data[1] + 8*mb_x + (8*mb_y + y)*pict->linesize[1])= c; - *(uint64_t*)(pict->data[2] + 8*mb_x + (8*mb_y + y)*pict->linesize[2])= c; + for(y=0; ydata[1] + 8*mb_x + (block_height*mb_y + y)*pict->linesize[1])= c; + *(uint64_t*)(pict->data[2] + 8*mb_x + (block_height*mb_y + y)*pict->linesize[2])= c; } } if((s->avctx->debug&FF_DEBUG_VIS_MB_TYPE) && pict->motion_val){ @@ -1310,9 +1298,9 @@ v= (int)(128 + r*sin(theta*3.141592/180)); u*= 0x0101010101010101ULL; v*= 0x0101010101010101ULL; - for(y=0; y<8; y++){ - *(uint64_t*)(pict->data[1] + 8*mb_x + (8*mb_y + y)*pict->linesize[1])= u; - *(uint64_t*)(pict->data[2] + 8*mb_x + (8*mb_y + y)*pict->linesize[2])= v; + for(y=0; ydata[1] + 8*mb_x + (block_height*mb_y + y)*pict->linesize[1])= u; + *(uint64_t*)(pict->data[2] + 8*mb_x + (block_height*mb_y + y)*pict->linesize[2])= v; } //segmentation @@ -1409,7 +1397,7 @@ static av_always_inline void mpeg_motion_lowres(MpegEncContext *s, linesize = s->current_picture.linesize[0] << field_based; uvlinesize = s->current_picture.linesize[1] << field_based; - if(s->quarter_sample){ //FIXME obviously not perfect but qpel wont work in lowres anyway + if(s->quarter_sample){ //FIXME obviously not perfect but qpel will not work in lowres anyway motion_x/=2; motion_y/=2; } @@ -1737,7 +1725,7 @@ void ff_clean_intra_table_entries(MpegEncContext *s) */ static av_always_inline void MPV_decode_mb_internal(MpegEncContext *s, DCTELEM block[12][64], - int lowres_flag) + int lowres_flag, int is_mpeg12) { int mb_x, mb_y; const int mb_xy = s->mb_y * s->mb_stride + s->mb_x; @@ -1764,7 +1752,7 @@ void MPV_decode_mb_internal(MpegEncContext *s, DCTELEM block[12][64], /* update DC predictors for P macroblocks */ if (!s->mb_intra) { - if (s->h263_pred || s->h263_aic) { + if (!is_mpeg12 && (s->h263_pred || s->h263_aic)) { if(s->mbintra_table[mb_xy]) ff_clean_intra_table_entries(s); } else { @@ -1773,7 +1761,7 @@ void MPV_decode_mb_internal(MpegEncContext *s, DCTELEM block[12][64], s->last_dc[2] = 128 << s->intra_dc_precision; } } - else if (s->h263_pred || s->h263_aic) + else if (!is_mpeg12 && (s->h263_pred || s->h263_aic)) s->mbintra_table[mb_xy]=1; if ((s->flags&CODEC_FLAG_PSNR) || !(s->encoding && (s->intra_only || s->pict_type==FF_B_TYPE) && s->avctx->mb_decision != FF_MB_DECISION_RD)) { //FIXME precalc @@ -1888,7 +1876,7 @@ void MPV_decode_mb_internal(MpegEncContext *s, DCTELEM block[12][64], add_dequant_dct(s, block[7], 7, dest_cr + dct_offset, dct_linesize, s->chroma_qscale); } } - } else if(s->codec_id != CODEC_ID_WMV2){ + } else if(is_mpeg12 || (s->codec_id != CODEC_ID_WMV2)){ add_dct(s, block[0], 0, dest_y , dct_linesize); add_dct(s, block[1], 1, dest_y + block_size, dct_linesize); add_dct(s, block[2], 2, dest_y + dct_offset , dct_linesize); @@ -1979,8 +1967,14 @@ skip_idct: } void MPV_decode_mb(MpegEncContext *s, DCTELEM block[12][64]){ - if(s->avctx->lowres) MPV_decode_mb_internal(s, block, 1); - else MPV_decode_mb_internal(s, block, 0); +#ifndef CONFIG_SMALL + if(s->out_format == FMT_MPEG1) { + if(s->avctx->lowres) MPV_decode_mb_internal(s, block, 1, 1); + else MPV_decode_mb_internal(s, block, 0, 1); + } else +#endif + if(s->avctx->lowres) MPV_decode_mb_internal(s, block, 1, 0); + else MPV_decode_mb_internal(s, block, 0, 0); } /**