avcodec/mpeg4videodec: Make studio VLCs static
Reviewed-by: Michael Niedermayer <michael@niedermayer.cc> Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>
This commit is contained in:
		
							parent
							
								
									3aa81a634a
								
							
						
					
					
						commit
						f1ba4d479e
					
				@ -115,10 +115,6 @@ typedef struct Mpeg4DecContext {
 | 
			
		||||
    int cplx_estimation_trash_p;
 | 
			
		||||
    int cplx_estimation_trash_b;
 | 
			
		||||
 | 
			
		||||
    VLC studio_intra_tab[12];
 | 
			
		||||
    VLC studio_luma_dc;
 | 
			
		||||
    VLC studio_chroma_dc;
 | 
			
		||||
 | 
			
		||||
    int rgb;
 | 
			
		||||
} Mpeg4DecContext;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -25,6 +25,7 @@
 | 
			
		||||
#include "libavutil/internal.h"
 | 
			
		||||
#include "libavutil/opt.h"
 | 
			
		||||
#include "libavutil/pixdesc.h"
 | 
			
		||||
#include "libavutil/thread.h"
 | 
			
		||||
#include "error_resilience.h"
 | 
			
		||||
#include "hwconfig.h"
 | 
			
		||||
#include "idctdsp.h"
 | 
			
		||||
@ -53,6 +54,9 @@ static int decode_studio_vol_header(Mpeg4DecContext *ctx, GetBitContext *gb);
 | 
			
		||||
static VLC dc_lum, dc_chrom;
 | 
			
		||||
static VLC sprite_trajectory;
 | 
			
		||||
static VLC mb_type_b_vlc;
 | 
			
		||||
static VLC studio_intra_tab[12];
 | 
			
		||||
static VLC studio_luma_dc;
 | 
			
		||||
static VLC studio_chroma_dc;
 | 
			
		||||
 | 
			
		||||
static const int mb_type_b_map[4] = {
 | 
			
		||||
    MB_TYPE_DIRECT2 | MB_TYPE_L0L1,
 | 
			
		||||
@ -1820,7 +1824,7 @@ static int mpeg4_decode_studio_block(MpegEncContext *s, int32_t block[64], int n
 | 
			
		||||
 | 
			
		||||
    int cc, dct_dc_size, dct_diff, code, j, idx = 1, group = 0, run = 0,
 | 
			
		||||
        additional_code_len, sign, mismatch;
 | 
			
		||||
    VLC *cur_vlc = &ctx->studio_intra_tab[0];
 | 
			
		||||
    const VLC *cur_vlc = &studio_intra_tab[0];
 | 
			
		||||
    uint8_t *const scantable = s->intra_scantable.permutated;
 | 
			
		||||
    const uint16_t *quant_matrix;
 | 
			
		||||
    uint32_t flc;
 | 
			
		||||
@ -1834,14 +1838,14 @@ static int mpeg4_decode_studio_block(MpegEncContext *s, int32_t block[64], int n
 | 
			
		||||
 | 
			
		||||
    if (n < 4) {
 | 
			
		||||
        cc = 0;
 | 
			
		||||
        dct_dc_size = get_vlc2(&s->gb, ctx->studio_luma_dc.table, STUDIO_INTRA_BITS, 2);
 | 
			
		||||
        dct_dc_size = get_vlc2(&s->gb, studio_luma_dc.table, STUDIO_INTRA_BITS, 2);
 | 
			
		||||
        quant_matrix = s->intra_matrix;
 | 
			
		||||
    } else {
 | 
			
		||||
        cc = (n & 1) + 1;
 | 
			
		||||
        if (ctx->rgb)
 | 
			
		||||
            dct_dc_size = get_vlc2(&s->gb, ctx->studio_luma_dc.table, STUDIO_INTRA_BITS, 2);
 | 
			
		||||
            dct_dc_size = get_vlc2(&s->gb, studio_luma_dc.table, STUDIO_INTRA_BITS, 2);
 | 
			
		||||
        else
 | 
			
		||||
            dct_dc_size = get_vlc2(&s->gb, ctx->studio_chroma_dc.table, STUDIO_INTRA_BITS, 2);
 | 
			
		||||
            dct_dc_size = get_vlc2(&s->gb, studio_chroma_dc.table, STUDIO_INTRA_BITS, 2);
 | 
			
		||||
        quant_matrix = s->chroma_intra_matrix;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@ -1878,7 +1882,7 @@ static int mpeg4_decode_studio_block(MpegEncContext *s, int32_t block[64], int n
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        additional_code_len = ac_state_tab[group][0];
 | 
			
		||||
        cur_vlc = &ctx->studio_intra_tab[ac_state_tab[group][1]];
 | 
			
		||||
        cur_vlc = &studio_intra_tab[ac_state_tab[group][1]];
 | 
			
		||||
 | 
			
		||||
        if (group == 0) {
 | 
			
		||||
            /* End of Block */
 | 
			
		||||
@ -3501,40 +3505,36 @@ static int mpeg4_update_thread_context(AVCodecContext *dst,
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
static av_cold int init_studio_vlcs(Mpeg4DecContext *ctx)
 | 
			
		||||
static av_cold void mpeg4_init_static(void)
 | 
			
		||||
{
 | 
			
		||||
    int i, ret;
 | 
			
		||||
    INIT_VLC_STATIC_FROM_LENGTHS(&studio_luma_dc, STUDIO_INTRA_BITS, 19,
 | 
			
		||||
                                 &ff_mpeg4_studio_dc_luma[0][1], 2,
 | 
			
		||||
                                 &ff_mpeg4_studio_dc_luma[0][0], 2, 1,
 | 
			
		||||
                                 0, 0, 528);
 | 
			
		||||
 | 
			
		||||
    for (i = 0; i < 12; i++) {
 | 
			
		||||
        ret = ff_init_vlc_from_lengths(&ctx->studio_intra_tab[i],
 | 
			
		||||
                                       STUDIO_INTRA_BITS, 24,
 | 
			
		||||
                                       &ff_mpeg4_studio_intra[i][0][1], 2,
 | 
			
		||||
                                       &ff_mpeg4_studio_intra[i][0][0], 2, 1,
 | 
			
		||||
                                       0, 0, NULL);
 | 
			
		||||
    INIT_VLC_STATIC_FROM_LENGTHS(&studio_chroma_dc, STUDIO_INTRA_BITS, 19,
 | 
			
		||||
                                 &ff_mpeg4_studio_dc_chroma[0][1], 2,
 | 
			
		||||
                                 &ff_mpeg4_studio_dc_chroma[0][0], 2, 1,
 | 
			
		||||
                                 0, 0, 528);
 | 
			
		||||
 | 
			
		||||
        if (ret < 0)
 | 
			
		||||
            return ret;
 | 
			
		||||
    for (unsigned i = 0, offset = 0; i < 12; i++) {
 | 
			
		||||
        static VLC_TYPE vlc_buf[6498][2];
 | 
			
		||||
 | 
			
		||||
        studio_intra_tab[i].table           = &vlc_buf[offset];
 | 
			
		||||
        studio_intra_tab[i].table_allocated = FF_ARRAY_ELEMS(vlc_buf) - offset;
 | 
			
		||||
        ff_init_vlc_from_lengths(&studio_intra_tab[i],
 | 
			
		||||
                                 STUDIO_INTRA_BITS, 24,
 | 
			
		||||
                                 &ff_mpeg4_studio_intra[i][0][1], 2,
 | 
			
		||||
                                 &ff_mpeg4_studio_intra[i][0][0], 2, 1,
 | 
			
		||||
                                 0, INIT_VLC_STATIC_OVERLONG, NULL);
 | 
			
		||||
        offset += studio_intra_tab[i].table_size;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    ret = ff_init_vlc_from_lengths(&ctx->studio_luma_dc, STUDIO_INTRA_BITS, 19,
 | 
			
		||||
                                   &ff_mpeg4_studio_dc_luma[0][1], 2,
 | 
			
		||||
                                   &ff_mpeg4_studio_dc_luma[0][0], 2, 1,
 | 
			
		||||
                                   0, 0, NULL);
 | 
			
		||||
    if (ret < 0)
 | 
			
		||||
        return ret;
 | 
			
		||||
 | 
			
		||||
    ret = ff_init_vlc_from_lengths(&ctx->studio_chroma_dc, STUDIO_INTRA_BITS, 19,
 | 
			
		||||
                                   &ff_mpeg4_studio_dc_chroma[0][1], 2,
 | 
			
		||||
                                   &ff_mpeg4_studio_dc_chroma[0][0], 2, 1,
 | 
			
		||||
                                   0, 0, NULL);
 | 
			
		||||
    if (ret < 0)
 | 
			
		||||
        return ret;
 | 
			
		||||
 | 
			
		||||
    return 0;
 | 
			
		||||
    ff_mpeg4videodec_static_init();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static av_cold int decode_init(AVCodecContext *avctx)
 | 
			
		||||
{
 | 
			
		||||
    static AVOnce init_static_once = AV_ONCE_INIT;
 | 
			
		||||
    Mpeg4DecContext *ctx = avctx->priv_data;
 | 
			
		||||
    MpegEncContext *s = &ctx->m;
 | 
			
		||||
    int ret;
 | 
			
		||||
@ -3547,10 +3547,6 @@ static av_cold int decode_init(AVCodecContext *avctx)
 | 
			
		||||
    if ((ret = ff_h263_decode_init(avctx)) < 0)
 | 
			
		||||
        return ret;
 | 
			
		||||
 | 
			
		||||
    ff_mpeg4videodec_static_init();
 | 
			
		||||
    if ((ret = init_studio_vlcs(ctx)) < 0)
 | 
			
		||||
        return ret;
 | 
			
		||||
 | 
			
		||||
    s->h263_pred = 1;
 | 
			
		||||
    s->low_delay = 0; /* default, might be overridden in the vol header during header parsing */
 | 
			
		||||
    s->decode_mb = mpeg4_decode_mb;
 | 
			
		||||
@ -3558,23 +3554,11 @@ static av_cold int decode_init(AVCodecContext *avctx)
 | 
			
		||||
 | 
			
		||||
    avctx->chroma_sample_location = AVCHROMA_LOC_LEFT;
 | 
			
		||||
 | 
			
		||||
    ff_thread_once(&init_static_once, mpeg4_init_static);
 | 
			
		||||
 | 
			
		||||
    return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static av_cold int decode_end(AVCodecContext *avctx)
 | 
			
		||||
{
 | 
			
		||||
    Mpeg4DecContext *ctx = avctx->priv_data;
 | 
			
		||||
    int i;
 | 
			
		||||
 | 
			
		||||
    for (i = 0; i < 12; i++)
 | 
			
		||||
        ff_free_vlc(&ctx->studio_intra_tab[i]);
 | 
			
		||||
 | 
			
		||||
    ff_free_vlc(&ctx->studio_luma_dc);
 | 
			
		||||
    ff_free_vlc(&ctx->studio_chroma_dc);
 | 
			
		||||
 | 
			
		||||
    return ff_h263_decode_end(avctx);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static const AVOption mpeg4_options[] = {
 | 
			
		||||
    {"quarter_sample", "1/4 subpel MC", offsetof(MpegEncContext, quarter_sample), AV_OPT_TYPE_BOOL, {.i64 = 0}, 0, 1, 0},
 | 
			
		||||
    {"divx_packed", "divx style packed b frames", offsetof(MpegEncContext, divx_packed), AV_OPT_TYPE_BOOL, {.i64 = 0}, 0, 1, 0},
 | 
			
		||||
@ -3595,7 +3579,7 @@ AVCodec ff_mpeg4_decoder = {
 | 
			
		||||
    .id                    = AV_CODEC_ID_MPEG4,
 | 
			
		||||
    .priv_data_size        = sizeof(Mpeg4DecContext),
 | 
			
		||||
    .init                  = decode_init,
 | 
			
		||||
    .close                 = decode_end,
 | 
			
		||||
    .close                 = ff_h263_decode_end,
 | 
			
		||||
    .decode                = ff_h263_decode_frame,
 | 
			
		||||
    .capabilities          = AV_CODEC_CAP_DRAW_HORIZ_BAND | AV_CODEC_CAP_DR1 |
 | 
			
		||||
                             AV_CODEC_CAP_TRUNCATED | AV_CODEC_CAP_DELAY |
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user