summaryrefslogtreecommitdiff
path: root/src/libffmpeg/libavcodec/mpeg12.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/libffmpeg/libavcodec/mpeg12.c')
-rw-r--r--src/libffmpeg/libavcodec/mpeg12.c48
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;
}