Originally committed as revision 22622 to svn://svn.ffmpeg.org/ffmpeg/trunktags/v0.6
| @@ -626,6 +626,12 @@ $(SUBDIR)mpegaudio_tablegen$(HOSTEXESUF): HOSTCFLAGS += -DFRAC_BITS=15 | |||||
| $(SUBDIR)mpegaudio_tablegen.ho: CPPFLAGS += -DFRAC_BITS=15 | $(SUBDIR)mpegaudio_tablegen.ho: CPPFLAGS += -DFRAC_BITS=15 | ||||
| endif | endif | ||||
| ifdef CONFIG_SMALL | |||||
| $(SUBDIR)%_tablegen$(HOSTEXESUF): HOSTCFLAGS += -DCONFIG_SMALL=1 | |||||
| else | |||||
| $(SUBDIR)%_tablegen$(HOSTEXESUF): HOSTCFLAGS += -DCONFIG_SMALL=0 | |||||
| endif | |||||
| $(SUBDIR)%_tablegen$(HOSTEXESUF): $(SUBDIR)%_tablegen.c $(SUBDIR)tableprint.c | $(SUBDIR)%_tablegen$(HOSTEXESUF): $(SUBDIR)%_tablegen.c $(SUBDIR)tableprint.c | ||||
| $(HOSTCC) $(HOSTCFLAGS) $(HOSTLDFLAGS) -o $@ $^ $(HOSTLIBS) | $(HOSTCC) $(HOSTCFLAGS) $(HOSTLDFLAGS) -o $@ $^ $(HOSTLIBS) | ||||
| @@ -634,6 +640,7 @@ $(SUBDIR)%_tables.h: $(SUBDIR)%_tablegen$(HOSTEXESUF) | |||||
| ifdef CONFIG_HARDCODED_TABLES | ifdef CONFIG_HARDCODED_TABLES | ||||
| $(SUBDIR)aac.o: $(SUBDIR)cbrt_tables.h | $(SUBDIR)aac.o: $(SUBDIR)cbrt_tables.h | ||||
| $(SUBDIR)dv.o: $(SUBDIR)dv_tables.h | |||||
| $(SUBDIR)mdct.o: $(SUBDIR)mdct_tables.h | $(SUBDIR)mdct.o: $(SUBDIR)mdct_tables.h | ||||
| $(SUBDIR)mpegaudiodec.o: $(SUBDIR)mpegaudio_tables.h | $(SUBDIR)mpegaudiodec.o: $(SUBDIR)mpegaudio_tables.h | ||||
| $(SUBDIR)motionpixels.o: $(SUBDIR)motionpixels_tables.h | $(SUBDIR)motionpixels.o: $(SUBDIR)motionpixels_tables.h | ||||
| @@ -44,7 +44,7 @@ | |||||
| #include "put_bits.h" | #include "put_bits.h" | ||||
| #include "simple_idct.h" | #include "simple_idct.h" | ||||
| #include "dvdata.h" | #include "dvdata.h" | ||||
| #include "dv_vlc_data.h" | |||||
| #include "dv_tablegen.h" | |||||
| //#undef NDEBUG | //#undef NDEBUG | ||||
| //#include <assert.h> | //#include <assert.h> | ||||
| @@ -65,21 +65,8 @@ typedef struct DVVideoContext { | |||||
| #define TEX_VLC_BITS 9 | #define TEX_VLC_BITS 9 | ||||
| #if CONFIG_SMALL | |||||
| #define DV_VLC_MAP_RUN_SIZE 15 | |||||
| #define DV_VLC_MAP_LEV_SIZE 23 | |||||
| #else | |||||
| #define DV_VLC_MAP_RUN_SIZE 64 | |||||
| #define DV_VLC_MAP_LEV_SIZE 512 //FIXME sign was removed so this should be /2 but needs check | |||||
| #endif | |||||
| /* XXX: also include quantization */ | /* XXX: also include quantization */ | ||||
| static RL_VLC_ELEM dv_rl_vlc[1184]; | static RL_VLC_ELEM dv_rl_vlc[1184]; | ||||
| /* VLC encoding lookup table */ | |||||
| static struct dv_vlc_pair { | |||||
| uint32_t vlc; | |||||
| uint8_t size; | |||||
| } dv_vlc_map[DV_VLC_MAP_RUN_SIZE][DV_VLC_MAP_LEV_SIZE]; | |||||
| static inline int dv_work_pool_size(const DVprofile *d) | static inline int dv_work_pool_size(const DVprofile *d) | ||||
| { | { | ||||
| @@ -326,47 +313,7 @@ static av_cold int dvvideo_init(AVCodecContext *avctx) | |||||
| } | } | ||||
| free_vlc(&dv_vlc); | free_vlc(&dv_vlc); | ||||
| for (i = 0; i < NB_DV_VLC - 1; i++) { | |||||
| if (dv_vlc_run[i] >= DV_VLC_MAP_RUN_SIZE) | |||||
| continue; | |||||
| #if CONFIG_SMALL | |||||
| if (dv_vlc_level[i] >= DV_VLC_MAP_LEV_SIZE) | |||||
| continue; | |||||
| #endif | |||||
| if (dv_vlc_map[dv_vlc_run[i]][dv_vlc_level[i]].size != 0) | |||||
| continue; | |||||
| dv_vlc_map[dv_vlc_run[i]][dv_vlc_level[i]].vlc = | |||||
| dv_vlc_bits[i] << (!!dv_vlc_level[i]); | |||||
| dv_vlc_map[dv_vlc_run[i]][dv_vlc_level[i]].size = | |||||
| dv_vlc_len[i] + (!!dv_vlc_level[i]); | |||||
| } | |||||
| for (i = 0; i < DV_VLC_MAP_RUN_SIZE; i++) { | |||||
| #if CONFIG_SMALL | |||||
| for (j = 1; j < DV_VLC_MAP_LEV_SIZE; j++) { | |||||
| if (dv_vlc_map[i][j].size == 0) { | |||||
| dv_vlc_map[i][j].vlc = dv_vlc_map[0][j].vlc | | |||||
| (dv_vlc_map[i-1][0].vlc << (dv_vlc_map[0][j].size)); | |||||
| dv_vlc_map[i][j].size = dv_vlc_map[i-1][0].size + | |||||
| dv_vlc_map[0][j].size; | |||||
| } | |||||
| } | |||||
| #else | |||||
| for (j = 1; j < DV_VLC_MAP_LEV_SIZE/2; j++) { | |||||
| if (dv_vlc_map[i][j].size == 0) { | |||||
| dv_vlc_map[i][j].vlc = dv_vlc_map[0][j].vlc | | |||||
| (dv_vlc_map[i-1][0].vlc << (dv_vlc_map[0][j].size)); | |||||
| dv_vlc_map[i][j].size = dv_vlc_map[i-1][0].size + | |||||
| dv_vlc_map[0][j].size; | |||||
| } | |||||
| dv_vlc_map[i][((uint16_t)(-j))&0x1ff].vlc = | |||||
| dv_vlc_map[i][j].vlc | 1; | |||||
| dv_vlc_map[i][((uint16_t)(-j))&0x1ff].size = | |||||
| dv_vlc_map[i][j].size; | |||||
| } | |||||
| #endif | |||||
| } | |||||
| dv_vlc_map_tableinit(); | |||||
| } | } | ||||
| /* Generic DSP setup */ | /* Generic DSP setup */ | ||||
| @@ -0,0 +1,50 @@ | |||||
| /* | |||||
| * Generate a header file for hardcoded DV tables | |||||
| * | |||||
| * Copyright (c) 2010 Reimar Döffinger <Reimar.Doeffinger@gmx.de> | |||||
| * | |||||
| * This file is part of FFmpeg. | |||||
| * | |||||
| * FFmpeg is free software; you can redistribute it and/or | |||||
| * modify it under the terms of the GNU Lesser General Public | |||||
| * License as published by the Free Software Foundation; either | |||||
| * version 2.1 of the License, or (at your option) any later version. | |||||
| * | |||||
| * FFmpeg is distributed in the hope that it will be useful, | |||||
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |||||
| * Lesser General Public License for more details. | |||||
| * | |||||
| * You should have received a copy of the GNU Lesser General Public | |||||
| * License along with FFmpeg; if not, write to the Free Software | |||||
| * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | |||||
| */ | |||||
| #include <stdlib.h> | |||||
| #define CONFIG_HARDCODED_TABLES 0 | |||||
| #ifndef CONFIG_SMALL | |||||
| #error CONFIG_SMALL must be defined to generate tables | |||||
| #endif | |||||
| #include "dv_tablegen.h" | |||||
| #include "tableprint.h" | |||||
| #include <inttypes.h> | |||||
| WRITE_1D_FUNC_ARGV(vlc_pair, struct dv_vlc_pair, 7, | |||||
| "{0x%"PRIx32", %"PRId8"}", data[i].vlc, data[i].size) | |||||
| WRITE_2D_FUNC(vlc_pair, struct dv_vlc_pair) | |||||
| void tableinit(void) | |||||
| { | |||||
| dv_vlc_map_tableinit(); | |||||
| } | |||||
| const struct tabledef tables[] = { | |||||
| { | |||||
| "static const struct dv_vlc_pair dv_vlc_map[DV_VLC_MAP_RUN_SIZE][DV_VLC_MAP_LEV_SIZE]", | |||||
| write_vlc_pair_2d_array, | |||||
| dv_vlc_map, | |||||
| DV_VLC_MAP_RUN_SIZE, | |||||
| DV_VLC_MAP_LEV_SIZE | |||||
| }, | |||||
| { NULL } | |||||
| }; | |||||
| @@ -0,0 +1,96 @@ | |||||
| /* | |||||
| * Header file for hardcoded DV tables | |||||
| * | |||||
| * Copyright (c) 2010 Reimar Döffinger <Reimar.Doeffinger@gmx.de> | |||||
| * | |||||
| * This file is part of FFmpeg. | |||||
| * | |||||
| * FFmpeg is free software; you can redistribute it and/or | |||||
| * modify it under the terms of the GNU Lesser General Public | |||||
| * License as published by the Free Software Foundation; either | |||||
| * version 2.1 of the License, or (at your option) any later version. | |||||
| * | |||||
| * FFmpeg is distributed in the hope that it will be useful, | |||||
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |||||
| * Lesser General Public License for more details. | |||||
| * | |||||
| * You should have received a copy of the GNU Lesser General Public | |||||
| * License along with FFmpeg; if not, write to the Free Software | |||||
| * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | |||||
| */ | |||||
| #ifndef DV_TABLEGEN_H | |||||
| #define DV_TABLEGEN_H | |||||
| #include <stdint.h> | |||||
| #include "dv_vlc_data.h" | |||||
| #if CONFIG_SMALL | |||||
| #define DV_VLC_MAP_RUN_SIZE 15 | |||||
| #define DV_VLC_MAP_LEV_SIZE 23 | |||||
| #else | |||||
| #define DV_VLC_MAP_RUN_SIZE 64 | |||||
| #define DV_VLC_MAP_LEV_SIZE 512 //FIXME sign was removed so this should be /2 but needs check | |||||
| #endif | |||||
| /* VLC encoding lookup table */ | |||||
| struct dv_vlc_pair { | |||||
| uint32_t vlc; | |||||
| uint32_t size; | |||||
| }; | |||||
| #if CONFIG_HARDCODED_TABLES | |||||
| #define dv_vlc_map_tableinit() | |||||
| #include "libavcodec/dv_tables.h" | |||||
| #else | |||||
| static struct dv_vlc_pair dv_vlc_map[DV_VLC_MAP_RUN_SIZE][DV_VLC_MAP_LEV_SIZE]; | |||||
| static void dv_vlc_map_tableinit(void) | |||||
| { | |||||
| int i, j; | |||||
| for (i = 0; i < NB_DV_VLC - 1; i++) { | |||||
| if (dv_vlc_run[i] >= DV_VLC_MAP_RUN_SIZE) | |||||
| continue; | |||||
| #if CONFIG_SMALL | |||||
| if (dv_vlc_level[i] >= DV_VLC_MAP_LEV_SIZE) | |||||
| continue; | |||||
| #endif | |||||
| if (dv_vlc_map[dv_vlc_run[i]][dv_vlc_level[i]].size != 0) | |||||
| continue; | |||||
| dv_vlc_map[dv_vlc_run[i]][dv_vlc_level[i]].vlc = | |||||
| dv_vlc_bits[i] << (!!dv_vlc_level[i]); | |||||
| dv_vlc_map[dv_vlc_run[i]][dv_vlc_level[i]].size = | |||||
| dv_vlc_len[i] + (!!dv_vlc_level[i]); | |||||
| } | |||||
| for (i = 0; i < DV_VLC_MAP_RUN_SIZE; i++) { | |||||
| #if CONFIG_SMALL | |||||
| for (j = 1; j < DV_VLC_MAP_LEV_SIZE; j++) { | |||||
| if (dv_vlc_map[i][j].size == 0) { | |||||
| dv_vlc_map[i][j].vlc = dv_vlc_map[0][j].vlc | | |||||
| (dv_vlc_map[i-1][0].vlc << (dv_vlc_map[0][j].size)); | |||||
| dv_vlc_map[i][j].size = dv_vlc_map[i-1][0].size + | |||||
| dv_vlc_map[0][j].size; | |||||
| } | |||||
| } | |||||
| #else | |||||
| for (j = 1; j < DV_VLC_MAP_LEV_SIZE/2; j++) { | |||||
| if (dv_vlc_map[i][j].size == 0) { | |||||
| dv_vlc_map[i][j].vlc = dv_vlc_map[0][j].vlc | | |||||
| (dv_vlc_map[i-1][0].vlc << (dv_vlc_map[0][j].size)); | |||||
| dv_vlc_map[i][j].size = dv_vlc_map[i-1][0].size + | |||||
| dv_vlc_map[0][j].size; | |||||
| } | |||||
| dv_vlc_map[i][((uint16_t)(-j))&0x1ff].vlc = | |||||
| dv_vlc_map[i][j].vlc | 1; | |||||
| dv_vlc_map[i][((uint16_t)(-j))&0x1ff].size = | |||||
| dv_vlc_map[i][j].size; | |||||
| } | |||||
| #endif | |||||
| } | |||||
| } | |||||
| #endif /* CONFIG_HARDCODED_TABLES */ | |||||
| #endif /* DV_TABLEGEN_H */ | |||||