X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Fmsmpeg4enc.c;h=a4efbd34e6202c7b404c872f721a23f4709de6d3;hb=f01286957ee2a2a6cafcdaa909f7c355427d32db;hp=144468b24f16df8650be3dd91207ab26067e16a6;hpb=c6892f59eb0e9f2a9ec1f55b21a5841a60540e1f;p=ffmpeg diff --git a/libavcodec/msmpeg4enc.c b/libavcodec/msmpeg4enc.c index 144468b24f1..a4efbd34e62 100644 --- a/libavcodec/msmpeg4enc.c +++ b/libavcodec/msmpeg4enc.c @@ -32,7 +32,7 @@ #include "libavutil/attributes.h" #include "libavutil/avutil.h" -#include "libavutil/mem.h" +#include "libavutil/thread.h" #include "mpegvideo.h" #include "h263.h" #include "internal.h" @@ -46,25 +46,21 @@ static uint8_t rl_length[NB_RL_TABLES][MAX_LEVEL+1][MAX_RUN+1][2]; /* build the table which associate a (x,y) motion vector to a vlc */ -static av_cold int init_mv_table(MVTable *tab) +static av_cold void init_mv_table(MVTable *tab, uint16_t table_mv_index[4096]) { int i, x, y; - tab->table_mv_index = av_malloc(sizeof(uint16_t) * 4096); - if (!tab->table_mv_index) - return AVERROR(ENOMEM); + tab->table_mv_index = table_mv_index; /* mark all entries as not used */ for(i=0;i<4096;i++) - tab->table_mv_index[i] = tab->n; + tab->table_mv_index[i] = MSMPEG4_MV_TABLES_NB_ELEMS; - for(i=0;in;i++) { + for (i = 0; i < MSMPEG4_MV_TABLES_NB_ELEMS; i++) { x = tab->table_mvx[i]; y = tab->table_mvy[i]; tab->table_mv_index[(x << 6) | y] = i; } - - return 0; } void ff_msmpeg4_code012(PutBitContext *pb, int n) @@ -77,7 +73,9 @@ void ff_msmpeg4_code012(PutBitContext *pb, int n) } } -static int get_size_of_code(MpegEncContext * s, RLTable *rl, int last, int run, int level, int intra){ +static int get_size_of_code(const RLTable *rl, int last, int run, + int level, int intra) +{ int size=0; int code; int run_diff= intra ? 0 : 1; @@ -118,42 +116,35 @@ static int get_size_of_code(MpegEncContext * s, RLTable *rl, int last, int run, return size; } -av_cold int ff_msmpeg4_encode_init(MpegEncContext *s) +static av_cold void msmpeg4_encode_init_static(void) { - static int init_done=0; - int i, ret; - - ff_msmpeg4_common_init(s); - if(s->msmpeg4_version>=4){ - s->min_qcoeff= -255; - s->max_qcoeff= 255; - } - - if (!init_done) { - /* init various encoding tables */ - init_done = 1; - if ((ret = init_mv_table(&ff_mv_tables[0])) < 0) - return ret; - if ((ret = init_mv_table(&ff_mv_tables[1])) < 0) - return ret; - for(i=0;imsmpeg4_version >= 4) { + s->min_qcoeff = -255; + s->max_qcoeff = 255; + } - return 0; + /* init various encoding tables */ + ff_thread_once(&init_static_once, msmpeg4_encode_init_static); } static void find_best_tables(MpegEncContext * s) @@ -225,7 +216,7 @@ void ff_msmpeg4_encode_picture_header(MpegEncContext * s, int picture_number) { find_best_tables(s); - avpriv_align_put_bits(&s->pb); + align_put_bits(&s->pb); put_bits(&s->pb, 2, s->pict_type - 1); put_bits(&s->pb, 5, s->qscale); @@ -320,7 +311,7 @@ void ff_msmpeg4_encode_motion(MpegEncContext * s, put_bits(&s->pb, mv->table_mv_bits[code], mv->table_mv_code[code]); - if (code == mv->n) { + if (code == MSMPEG4_MV_TABLES_NB_ELEMS) { /* escape : code literally */ put_bits(&s->pb, 6, mx); put_bits(&s->pb, 6, my); @@ -499,8 +490,7 @@ void ff_msmpeg4_encode_mb(MpegEncContext * s, static void msmpeg4_encode_dc(MpegEncContext * s, int level, int n, int *dir_ptr) { int sign, code; - int pred, av_uninit(extquant); - int extrabits = 0; + int pred; int16_t *dc_val; pred = ff_msmpeg4_pred_dc(s, n, &dc_val, dir_ptr); @@ -534,15 +524,6 @@ static void msmpeg4_encode_dc(MpegEncContext * s, int level, int n, int *dir_ptr code = level; if (code > DC_MAX) code = DC_MAX; - else if( s->msmpeg4_version>=6 ) { - if( s->qscale == 1 ) { - extquant = (level + 3) & 0x3; - code = ((level+3)>>2); - } else if( s->qscale == 2 ) { - extquant = (level + 1) & 0x1; - code = ((level+1)>>1); - } - } if (s->dc_table_index == 0) { if (n < 4) { @@ -558,13 +539,8 @@ static void msmpeg4_encode_dc(MpegEncContext * s, int level, int n, int *dir_ptr } } - if(s->msmpeg4_version>=6 && s->qscale<=2) - extrabits = 3 - s->qscale; - if (code == DC_MAX) - put_bits(&s->pb, 8 + extrabits, level); - else if(extrabits > 0)//== VC1 && s->qscale<=2 - put_bits(&s->pb, extrabits, extquant); + put_bits(&s->pb, 8, level); if (level != 0) { put_bits(&s->pb, 1, sign); @@ -603,7 +579,7 @@ void ff_msmpeg4_encode_block(MpegEncContext * s, int16_t * block, int n) } /* recalculate block_last_index for M$ wmv1 */ - if(s->msmpeg4_version>=4 && s->msmpeg4_version<6 && s->block_last_index[n]>0){ + if (s->msmpeg4_version >= 4 && s->block_last_index[n] > 0) { for(last_index=63; last_index>=0; last_index--){ if(block[scantable[last_index]]) break; } @@ -663,7 +639,7 @@ void ff_msmpeg4_encode_block(MpegEncContext * s, int16_t * block, int n) s->esc3_run_length= 6; //ESCLVLSZ + ESCRUNSZ if(s->qscale<8) - put_bits(&s->pb, 6 + (s->msmpeg4_version>=6), 3); + put_bits(&s->pb, 6, 3); else put_bits(&s->pb, 8, 3); }