diff options
Diffstat (limited to 'src/libffmpeg/libavcodec/mpeg12.c')
-rw-r--r-- | src/libffmpeg/libavcodec/mpeg12.c | 48 |
1 files changed, 38 insertions, 10 deletions
diff --git a/src/libffmpeg/libavcodec/mpeg12.c b/src/libffmpeg/libavcodec/mpeg12.c index 493d1a445..20ca493f2 100644 --- a/src/libffmpeg/libavcodec/mpeg12.c +++ b/src/libffmpeg/libavcodec/mpeg12.c @@ -365,14 +365,10 @@ static inline void encode_mb_skip_run(MpegEncContext *s, int run){ static void common_init(MpegEncContext *s) { -int i; s->y_dc_scale_table= - s->c_dc_scale_table= ff_mpeg1_dc_scale_table; + s->c_dc_scale_table= mpeg2_dc_scale_table[s->intra_dc_precision]; - if(!s->encoding) - for(i=0;i<64;i++) - s->dsp.idct_permutation[i]=i; } void ff_mpeg1_clean_buffers(MpegEncContext *s){ @@ -784,7 +780,7 @@ void ff_mpeg1_encode_init(MpegEncContext *s) adiff = ABS(diff); if(diff<0) diff--; - index = vlc_dc_table[adiff]; + index = av_log2(2*adiff); bits= vlc_dc_lum_bits[index] + index; code= (vlc_dc_lum_code[index]<<index) + (diff & ((1 << index) - 1)); @@ -848,6 +844,27 @@ void ff_mpeg1_encode_init(MpegEncContext *s) static inline void encode_dc(MpegEncContext *s, int diff, int component) { + if(((unsigned) (diff+255)) >= 511){ + int index; + + if(diff<0){ + index= av_log2_16bit(-2*diff); + diff--; + }else{ + index= av_log2_16bit(2*diff); + } + if (component == 0) { + put_bits( + &s->pb, + vlc_dc_lum_bits[index] + index, + (vlc_dc_lum_code[index]<<index) + (diff & ((1 << index) - 1))); + }else{ + put_bits( + &s->pb, + vlc_dc_chroma_bits[index] + index, + (vlc_dc_chroma_code[index]<<index) + (diff & ((1 << index) - 1))); + } + }else{ if (component == 0) { put_bits( &s->pb, @@ -859,6 +876,7 @@ static inline void encode_dc(MpegEncContext *s, int diff, int component) mpeg1_chr_dc_uni[diff+255]&0xFF, mpeg1_chr_dc_uni[diff+255]>>8); } + } } static void mpeg1_encode_block(MpegEncContext *s, @@ -1770,7 +1788,14 @@ static int mpeg_decode_init(AVCodecContext *avctx) { Mpeg1Context *s = avctx->priv_data; MpegEncContext *s2 = &s->mpeg_enc_ctx; + int i; + //we need some parmutation to store + //matrixes, until MPV_common_init() + //set the real permutatuon + for(i=0;i<64;i++) + s2->dsp.idct_permutation[i]=i; + MPV_decode_defaults(s2); s->mpeg_enc_ctx.avctx= avctx; @@ -2726,8 +2751,8 @@ static void mpeg_decode_gop(AVCodecContext *avctx, * finds the end of the current frame in the bitstream. * @return the position of the first byte of the next frame, or -1 */ -static int mpeg1_find_frame_end(MpegEncContext *s, uint8_t *buf, int buf_size){ - ParseContext *pc= &s->parse_context; +int ff_mpeg1_find_frame_end(ParseContext *pc, const uint8_t *buf, int buf_size) +{ int i; uint32_t state; @@ -2746,6 +2771,9 @@ static int mpeg1_find_frame_end(MpegEncContext *s, uint8_t *buf, int buf_size){ } if(pc->frame_start_found){ + /* EOF considered as end of frame */ + if (buf_size == 0) + return 0; for(; i<buf_size; i++){ state= (state<<8) | buf[i]; if((state&0xFFFFFF00) == 0x100){ @@ -2786,9 +2814,9 @@ static int mpeg_decode_frame(AVCodecContext *avctx, } if(s2->flags&CODEC_FLAG_TRUNCATED){ - int next= mpeg1_find_frame_end(s2, buf, buf_size); + int next= ff_mpeg1_find_frame_end(&s2->parse_context, buf, buf_size); - if( ff_combine_frame(s2, next, &buf, &buf_size) < 0 ) + if( ff_combine_frame(&s2->parse_context, next, &buf, &buf_size) < 0 ) return buf_size; } |