X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Fvp3.c;h=163847013e36d0e6f9324af66f0d7cedd85a05b7;hb=913e93d5f2639bf46d2e9acfc7df0e15b200e005;hp=9cff50e55d436f7ff59c7bb814e98986b83d723c;hpb=8868d31065992b0157b790103759bc56b021ae0a;p=ffmpeg diff --git a/libavcodec/vp3.c b/libavcodec/vp3.c index 9cff50e55d4..163847013e3 100644 --- a/libavcodec/vp3.c +++ b/libavcodec/vp3.c @@ -13,7 +13,7 @@ * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * */ @@ -42,9 +42,9 @@ #define FRAGMENT_PIXELS 8 -/* +/* * Debugging Variables - * + * * Define one or more of the following compile-time variables to 1 to obtain * elaborate information about certain aspects of the decoding process. * @@ -89,49 +89,49 @@ static inline void debug_init(const char *format, ...) { } #if DEBUG_DEQUANTIZERS #define debug_dequantizers(args...) av_log(NULL, AV_LOG_DEBUG, ## args) #else -static inline void debug_dequantizers(const char *format, ...) { } +static inline void debug_dequantizers(const char *format, ...) { } #endif #if DEBUG_BLOCK_CODING #define debug_block_coding(args...) av_log(NULL, AV_LOG_DEBUG, ## args) #else -static inline void debug_block_coding(const char *format, ...) { } +static inline void debug_block_coding(const char *format, ...) { } #endif #if DEBUG_MODES -#define debug_modes(args...) av_log(NULL, AV_LOG_DEBUG, ## args) +#define debug_modes(args...) av_log(NULL, AV_LOG_DEBUG, ## args) #else -static inline void debug_modes(const char *format, ...) { } +static inline void debug_modes(const char *format, ...) { } #endif #if DEBUG_VECTORS #define debug_vectors(args...) av_log(NULL, AV_LOG_DEBUG, ## args) #else -static inline void debug_vectors(const char *format, ...) { } +static inline void debug_vectors(const char *format, ...) { } #endif -#if DEBUG_TOKEN +#if DEBUG_TOKEN #define debug_token(args...) av_log(NULL, AV_LOG_DEBUG, ## args) #else -static inline void debug_token(const char *format, ...) { } +static inline void debug_token(const char *format, ...) { } #endif #if DEBUG_VLC #define debug_vlc(args...) av_log(NULL, AV_LOG_DEBUG, ## args) #else -static inline void debug_vlc(const char *format, ...) { } +static inline void debug_vlc(const char *format, ...) { } #endif #if DEBUG_DC_PRED #define debug_dc_pred(args...) av_log(NULL, AV_LOG_DEBUG, ## args) #else -static inline void debug_dc_pred(const char *format, ...) { } +static inline void debug_dc_pred(const char *format, ...) { } #endif #if DEBUG_IDCT #define debug_idct(args...) av_log(NULL, AV_LOG_DEBUG, ## args) #else -static inline void debug_idct(const char *format, ...) { } +static inline void debug_idct(const char *format, ...) { } #endif typedef struct Coeff { @@ -178,39 +178,39 @@ static int ModeAlphabet[7][CODING_MODE_COUNT] = { 0, 0, 0, 0, 0, 0, 0, 0 }, /* scheme 1: Last motion vector dominates */ - { MODE_INTER_LAST_MV, MODE_INTER_PRIOR_LAST, + { MODE_INTER_LAST_MV, MODE_INTER_PRIOR_LAST, MODE_INTER_PLUS_MV, MODE_INTER_NO_MV, - MODE_INTRA, MODE_USING_GOLDEN, + MODE_INTRA, MODE_USING_GOLDEN, MODE_GOLDEN_MV, MODE_INTER_FOURMV }, /* scheme 2 */ - { MODE_INTER_LAST_MV, MODE_INTER_PRIOR_LAST, + { MODE_INTER_LAST_MV, MODE_INTER_PRIOR_LAST, MODE_INTER_NO_MV, MODE_INTER_PLUS_MV, - MODE_INTRA, MODE_USING_GOLDEN, + MODE_INTRA, MODE_USING_GOLDEN, MODE_GOLDEN_MV, MODE_INTER_FOURMV }, /* scheme 3 */ - { MODE_INTER_LAST_MV, MODE_INTER_PLUS_MV, + { MODE_INTER_LAST_MV, MODE_INTER_PLUS_MV, MODE_INTER_PRIOR_LAST, MODE_INTER_NO_MV, - MODE_INTRA, MODE_USING_GOLDEN, + MODE_INTRA, MODE_USING_GOLDEN, MODE_GOLDEN_MV, MODE_INTER_FOURMV }, /* scheme 4 */ - { MODE_INTER_LAST_MV, MODE_INTER_PLUS_MV, + { MODE_INTER_LAST_MV, MODE_INTER_PLUS_MV, MODE_INTER_NO_MV, MODE_INTER_PRIOR_LAST, - MODE_INTRA, MODE_USING_GOLDEN, + MODE_INTRA, MODE_USING_GOLDEN, MODE_GOLDEN_MV, MODE_INTER_FOURMV }, /* scheme 5: No motion vector dominates */ - { MODE_INTER_NO_MV, MODE_INTER_LAST_MV, + { MODE_INTER_NO_MV, MODE_INTER_LAST_MV, MODE_INTER_PRIOR_LAST, MODE_INTER_PLUS_MV, - MODE_INTRA, MODE_USING_GOLDEN, + MODE_INTRA, MODE_USING_GOLDEN, MODE_GOLDEN_MV, MODE_INTER_FOURMV }, /* scheme 6 */ - { MODE_INTER_NO_MV, MODE_USING_GOLDEN, + { MODE_INTER_NO_MV, MODE_USING_GOLDEN, MODE_INTER_LAST_MV, MODE_INTER_PRIOR_LAST, - MODE_INTER_PLUS_MV, MODE_INTRA, + MODE_INTER_PLUS_MV, MODE_INTRA, MODE_GOLDEN_MV, MODE_INTER_FOURMV }, }; @@ -256,9 +256,9 @@ typedef struct Vp3DecodeContext { Coeff *next_coeff; int u_fragment_start; int v_fragment_start; - + ScanTable scantable; - + /* tables */ uint16_t coded_dc_scale_factor[64]; uint32_t coded_ac_scale_factor[64]; @@ -285,9 +285,9 @@ typedef struct Vp3DecodeContext { /* these arrays need to be on 16-byte boundaries since SSE2 operations * index into them */ - int16_t __align16 intra_y_dequant[64]; - int16_t __align16 intra_c_dequant[64]; - int16_t __align16 inter_dequant[64]; + DECLARE_ALIGNED_16(int16_t, intra_y_dequant[64]); + DECLARE_ALIGNED_16(int16_t, intra_c_dequant[64]); + DECLARE_ALIGNED_16(int16_t, inter_dequant[64]); /* This table contains superblock_count * 16 entries. Each set of 16 * numbers corresponds to the fragment indices 0..15 of the superblock. @@ -305,7 +305,7 @@ typedef struct Vp3DecodeContext { * numbers corresponds to the fragment indices 0..5 which comprise * the macroblock (4 Y fragments and 2 C fragments). */ int *macroblock_fragments; - /* This is an array that indicates how a particular macroblock + /* This is an array that indicates how a particular macroblock * is coded. */ unsigned char *macroblock_coding; @@ -328,7 +328,6 @@ typedef struct Vp3DecodeContext { int bounding_values_array[256]; } Vp3DecodeContext; -static int theora_decode_comments(AVCodecContext *avctx, GetBitContext gb); static int theora_decode_tables(AVCodecContext *avctx, GetBitContext gb); /************************************************************************ @@ -342,7 +341,7 @@ static int theora_decode_tables(AVCodecContext *avctx, GetBitContext gb); * * Returns 0 is successful; returns 1 if *anything* went wrong. */ -static int init_block_mapping(Vp3DecodeContext *s) +static int init_block_mapping(Vp3DecodeContext *s) { int i, j; signed int hilbert_walk_y[16]; @@ -362,7 +361,7 @@ static int init_block_mapping(Vp3DecodeContext *s) int c_fragment; signed char travel_width[16] = { - 1, 1, 0, -1, + 1, 1, 0, -1, 0, 0, 1, 0, 1, 0, 1, 0, 0, -1, 0, 1 @@ -438,7 +437,7 @@ static int init_block_mapping(Vp3DecodeContext *s) bottom_edge = s->fragment_height; current_width = -1; current_height = 0; - superblock_row_inc = 3 * s->fragment_width - + superblock_row_inc = 3 * s->fragment_width - (s->y_superblock_width * 4 - s->fragment_width); hilbert = hilbert_walk_y; @@ -452,7 +451,7 @@ static int init_block_mapping(Vp3DecodeContext *s) bottom_edge = s->fragment_height / 2; current_width = -1; current_height = 0; - superblock_row_inc = 3 * (s->fragment_width / 2) - + superblock_row_inc = 3 * (s->fragment_width / 2) - (s->c_superblock_width * 4 - s->fragment_width / 2); hilbert = hilbert_walk_c; @@ -466,7 +465,7 @@ static int init_block_mapping(Vp3DecodeContext *s) bottom_edge = s->fragment_height / 2; current_width = -1; current_height = 0; - superblock_row_inc = 3 * (s->fragment_width / 2) - + superblock_row_inc = 3 * (s->fragment_width / 2) - (s->c_superblock_width * 4 - s->fragment_width / 2); hilbert = hilbert_walk_c; @@ -494,12 +493,12 @@ static int init_block_mapping(Vp3DecodeContext *s) if ((current_width < right_edge) && (current_height < bottom_edge)) { s->superblock_fragments[mapping_index] = current_fragment; - debug_init(" mapping fragment %d to superblock %d, position %d (%d/%d x %d/%d)\n", + debug_init(" mapping fragment %d to superblock %d, position %d (%d/%d x %d/%d)\n", s->superblock_fragments[mapping_index], i, j, current_width, right_edge, current_height, bottom_edge); } else { s->superblock_fragments[mapping_index] = -1; - debug_init(" superblock %d, position %d has no fragment (%d/%d x %d/%d)\n", + debug_init(" superblock %d, position %d has no fragment (%d/%d x %d/%d)\n", i, j, current_width, right_edge, current_height, bottom_edge); } @@ -575,31 +574,31 @@ static int init_block_mapping(Vp3DecodeContext *s) s->macroblock_fragments[mapping_index++] = -1; if (i + 1 < s->fragment_height) { - s->all_fragments[current_fragment + s->fragment_width].macroblock = + s->all_fragments[current_fragment + s->fragment_width].macroblock = current_macroblock; - s->macroblock_fragments[mapping_index++] = + s->macroblock_fragments[mapping_index++] = current_fragment + s->fragment_width; debug_init("%d ", current_fragment + s->fragment_width); } else s->macroblock_fragments[mapping_index++] = -1; if ((j + 1 < s->fragment_width) && (i + 1 < s->fragment_height)) { - s->all_fragments[current_fragment + s->fragment_width + 1].macroblock = + s->all_fragments[current_fragment + s->fragment_width + 1].macroblock = current_macroblock; - s->macroblock_fragments[mapping_index++] = + s->macroblock_fragments[mapping_index++] = current_fragment + s->fragment_width + 1; debug_init("%d ", current_fragment + s->fragment_width + 1); } else s->macroblock_fragments[mapping_index++] = -1; /* C planes */ - c_fragment = s->u_fragment_start + + c_fragment = s->u_fragment_start + (i * s->fragment_width / 4) + (j / 2); s->all_fragments[c_fragment].macroblock = s->macroblock_count; s->macroblock_fragments[mapping_index++] = c_fragment; debug_init("%d ", c_fragment); - c_fragment = s->v_fragment_start + + c_fragment = s->v_fragment_start + (i * s->fragment_width / 4) + (j / 2); s->all_fragments[c_fragment].macroblock = s->macroblock_count; s->macroblock_fragments[mapping_index++] = c_fragment; @@ -609,7 +608,7 @@ static int init_block_mapping(Vp3DecodeContext *s) if (j + 2 <= s->fragment_width) current_fragment += 2; - else + else current_fragment++; current_macroblock++; } @@ -653,7 +652,7 @@ static void init_dequantizer(Vp3DecodeContext *s) debug_vp3(" vp3: initializing dequantization tables\n"); - /* + /* * Scale dequantizers: * * quantizer * sf @@ -704,7 +703,7 @@ static void init_dequantizer(Vp3DecodeContext *s) s->inter_dequant[j] = MIN_DEQUANT_VAL * 2; s->inter_dequant[j] *= SCALER; } - + memset(s->qscale_table, (FFMAX(s->intra_y_dequant[1], s->intra_c_dequant[1])+8)/16, 512); //FIXME finetune /* print debug information as requested */ @@ -759,7 +758,7 @@ static void init_loop_filter(Vp3DecodeContext *s) } /* - * This function unpacks all of the superblock/macroblock/fragment coding + * This function unpacks all of the superblock/macroblock/fragment coding * information from the bitstream. */ static int unpack_superblocks(Vp3DecodeContext *s, GetBitContext *gb) @@ -785,13 +784,13 @@ static int unpack_superblocks(Vp3DecodeContext *s, GetBitContext *gb) /* unpack the list of partially-coded superblocks */ bit = get_bits(gb, 1); - /* toggle the bit because as soon as the first run length is + /* toggle the bit because as soon as the first run length is * fetched the bit will be toggled again */ bit ^= 1; while (current_superblock < s->superblock_count) { if (current_run-- == 0) { bit ^= 1; - current_run = get_vlc2(gb, + current_run = get_vlc2(gb, s->superblock_run_length_vlc.table, 6, 2); if (current_run == 33) current_run += get_bits(gb, 12); @@ -821,7 +820,7 @@ static int unpack_superblocks(Vp3DecodeContext *s, GetBitContext *gb) current_superblock = 0; current_run = 0; bit = get_bits(gb, 1); - /* toggle the bit because as soon as the first run length is + /* toggle the bit because as soon as the first run length is * fetched the bit will be toggled again */ bit ^= 1; while (current_superblock < s->superblock_count) { @@ -831,7 +830,7 @@ static int unpack_superblocks(Vp3DecodeContext *s, GetBitContext *gb) if (current_run-- == 0) { bit ^= 1; - current_run = get_vlc2(gb, + current_run = get_vlc2(gb, s->superblock_run_length_vlc.table, 6, 2); if (current_run == 33) current_run += get_bits(gb, 12); @@ -852,7 +851,7 @@ static int unpack_superblocks(Vp3DecodeContext *s, GetBitContext *gb) current_run = 0; bit = get_bits(gb, 1); - /* toggle the bit because as soon as the first run length is + /* toggle the bit because as soon as the first run length is * fetched the bit will be toggled again */ bit ^= 1; } @@ -882,7 +881,7 @@ static int unpack_superblocks(Vp3DecodeContext *s, GetBitContext *gb) if (s->superblock_coding[i] == SB_NOT_CODED) { /* copy all the fragments from the prior frame */ - s->all_fragments[current_fragment].coding_method = + s->all_fragments[current_fragment].coding_method = MODE_COPY; } else if (s->superblock_coding[i] == SB_PARTIALLY_CODED) { @@ -891,17 +890,17 @@ static int unpack_superblocks(Vp3DecodeContext *s, GetBitContext *gb) * that cares about the fragment coding runs */ if (current_run-- == 0) { bit ^= 1; - current_run = get_vlc2(gb, + current_run = get_vlc2(gb, s->fragment_run_length_vlc.table, 5, 2); } if (bit) { - /* default mode; actual mode will be decoded in + /* default mode; actual mode will be decoded in * the next phase */ - s->all_fragments[current_fragment].coding_method = + s->all_fragments[current_fragment].coding_method = MODE_INTER_NO_MV; s->all_fragments[current_fragment].next_coeff= s->coeffs + current_fragment; - s->coded_fragment_list[s->coded_fragment_list_index] = + s->coded_fragment_list[s->coded_fragment_list_index] = current_fragment; if ((current_fragment >= s->u_fragment_start) && (s->last_coded_y_fragment == -1) && @@ -926,10 +925,10 @@ static int unpack_superblocks(Vp3DecodeContext *s, GetBitContext *gb) /* fragments are fully coded in this superblock; actual * coding will be determined in next step */ - s->all_fragments[current_fragment].coding_method = + s->all_fragments[current_fragment].coding_method = MODE_INTER_NO_MV; s->all_fragments[current_fragment].next_coeff= s->coeffs + current_fragment; - s->coded_fragment_list[s->coded_fragment_list_index] = + s->coded_fragment_list[s->coded_fragment_list_index] = current_fragment; if ((current_fragment >= s->u_fragment_start) && (s->last_coded_y_fragment == -1) && @@ -950,7 +949,7 @@ static int unpack_superblocks(Vp3DecodeContext *s, GetBitContext *gb) if (!first_c_fragment_seen) /* only Y fragments coded in this frame */ s->last_coded_y_fragment = s->coded_fragment_list_index - 1; - else + else /* end the list of coded C fragments */ s->last_coded_c_fragment = s->coded_fragment_list_index - 1; @@ -998,7 +997,7 @@ static int unpack_modes(Vp3DecodeContext *s, GetBitContext *gb) } for (i = 0; i < 8; i++) - debug_modes(" mode[%d][%d] = %d\n", scheme, i, + debug_modes(" mode[%d][%d] = %d\n", scheme, i, ModeAlphabet[scheme][i]); /* iterate through all of the macroblocks that contain 1 or more @@ -1025,7 +1024,7 @@ static int unpack_modes(Vp3DecodeContext *s, GetBitContext *gb) s->macroblock_coding[current_macroblock] = coding_mode; for (k = 0; k < 6; k++) { - current_fragment = + current_fragment = s->macroblock_fragments[current_macroblock * 6 + k]; if (current_fragment == -1) continue; @@ -1034,7 +1033,7 @@ static int unpack_modes(Vp3DecodeContext *s, GetBitContext *gb) current_fragment, s->fragment_count); return 1; } - if (s->all_fragments[current_fragment].coding_method != + if (s->all_fragments[current_fragment].coding_method != MODE_COPY) s->all_fragments[current_fragment].coding_method = coding_mode; @@ -1146,13 +1145,13 @@ static int unpack_vectors(Vp3DecodeContext *s, GetBitContext *gb) motion_y[4] += motion_y[k]; } - if (motion_x[4] >= 0) + if (motion_x[4] >= 0) motion_x[4] = (motion_x[4] + 2) / 4; else motion_x[4] = (motion_x[4] - 2) / 4; motion_x[5] = motion_x[4]; - if (motion_y[4] >= 0) + if (motion_y[4] >= 0) motion_y[4] = (motion_y[4] + 2) / 4; else motion_y[4] = (motion_y[4] - 2) / 4; @@ -1210,7 +1209,7 @@ static int unpack_vectors(Vp3DecodeContext *s, GetBitContext *gb) current_fragment, s->macroblock_coding[current_macroblock]); for (k = 0; k < 6; k++) { - current_fragment = + current_fragment = s->macroblock_fragments[current_macroblock * 6 + k]; if (current_fragment == -1) continue; @@ -1231,7 +1230,7 @@ static int unpack_vectors(Vp3DecodeContext *s, GetBitContext *gb) return 0; } -/* +/* * This function is called by unpack_dct_coeffs() to extract the VLCs from * the bitstream. The VLCs encode tokens which are used to unpack DCT * data. This function unpacks all the VLCs for either the Y plane or both @@ -1306,7 +1305,7 @@ static int unpack_vlcs(Vp3DecodeContext *s, GetBitContext *gb, s->coded_fragment_list[i], fragment->next_coeff[coeff_index]); } else { fragment->coeff_count |= 128; - debug_vlc(" fragment %d eob with %d coefficients\n", + debug_vlc(" fragment %d eob with %d coefficients\n", s->coded_fragment_list[i], fragment->coeff_count&127); eob_run--; } @@ -1335,7 +1334,7 @@ static int unpack_dct_coeffs(Vp3DecodeContext *s, GetBitContext *gb) /* unpack the Y plane DC coefficients */ debug_vp3(" vp3: unpacking Y plane DC coefficients using table %d\n", dc_y_table); - residual_eob_run = unpack_vlcs(s, gb, &s->dc_vlc[dc_y_table], 0, + residual_eob_run = unpack_vlcs(s, gb, &s->dc_vlc[dc_y_table], 0, s->first_coded_y_fragment, s->last_coded_y_fragment, residual_eob_run); /* unpack the C plane DC coefficients */ @@ -1353,12 +1352,12 @@ static int unpack_dct_coeffs(Vp3DecodeContext *s, GetBitContext *gb) debug_vp3(" vp3: unpacking level %d Y plane AC coefficients using table %d\n", i, ac_y_table); - residual_eob_run = unpack_vlcs(s, gb, &s->ac_vlc_1[ac_y_table], i, + residual_eob_run = unpack_vlcs(s, gb, &s->ac_vlc_1[ac_y_table], i, s->first_coded_y_fragment, s->last_coded_y_fragment, residual_eob_run); debug_vp3(" vp3: unpacking level %d C plane AC coefficients using table %d\n", i, ac_c_table); - residual_eob_run = unpack_vlcs(s, gb, &s->ac_vlc_1[ac_c_table], i, + residual_eob_run = unpack_vlcs(s, gb, &s->ac_vlc_1[ac_c_table], i, s->first_coded_c_fragment, s->last_coded_c_fragment, residual_eob_run); } @@ -1367,12 +1366,12 @@ static int unpack_dct_coeffs(Vp3DecodeContext *s, GetBitContext *gb) debug_vp3(" vp3: unpacking level %d Y plane AC coefficients using table %d\n", i, ac_y_table); - residual_eob_run = unpack_vlcs(s, gb, &s->ac_vlc_2[ac_y_table], i, + residual_eob_run = unpack_vlcs(s, gb, &s->ac_vlc_2[ac_y_table], i, s->first_coded_y_fragment, s->last_coded_y_fragment, residual_eob_run); debug_vp3(" vp3: unpacking level %d C plane AC coefficients using table %d\n", i, ac_c_table); - residual_eob_run = unpack_vlcs(s, gb, &s->ac_vlc_2[ac_c_table], i, + residual_eob_run = unpack_vlcs(s, gb, &s->ac_vlc_2[ac_c_table], i, s->first_coded_c_fragment, s->last_coded_c_fragment, residual_eob_run); } @@ -1381,12 +1380,12 @@ static int unpack_dct_coeffs(Vp3DecodeContext *s, GetBitContext *gb) debug_vp3(" vp3: unpacking level %d Y plane AC coefficients using table %d\n", i, ac_y_table); - residual_eob_run = unpack_vlcs(s, gb, &s->ac_vlc_3[ac_y_table], i, + residual_eob_run = unpack_vlcs(s, gb, &s->ac_vlc_3[ac_y_table], i, s->first_coded_y_fragment, s->last_coded_y_fragment, residual_eob_run); debug_vp3(" vp3: unpacking level %d C plane AC coefficients using table %d\n", i, ac_c_table); - residual_eob_run = unpack_vlcs(s, gb, &s->ac_vlc_3[ac_c_table], i, + residual_eob_run = unpack_vlcs(s, gb, &s->ac_vlc_3[ac_c_table], i, s->first_coded_c_fragment, s->last_coded_c_fragment, residual_eob_run); } @@ -1395,12 +1394,12 @@ static int unpack_dct_coeffs(Vp3DecodeContext *s, GetBitContext *gb) debug_vp3(" vp3: unpacking level %d Y plane AC coefficients using table %d\n", i, ac_y_table); - residual_eob_run = unpack_vlcs(s, gb, &s->ac_vlc_4[ac_y_table], i, + residual_eob_run = unpack_vlcs(s, gb, &s->ac_vlc_4[ac_y_table], i, s->first_coded_y_fragment, s->last_coded_y_fragment, residual_eob_run); debug_vp3(" vp3: unpacking level %d C plane AC coefficients using table %d\n", i, ac_c_table); - residual_eob_run = unpack_vlcs(s, gb, &s->ac_vlc_4[ac_c_table], i, + residual_eob_run = unpack_vlcs(s, gb, &s->ac_vlc_4[ac_c_table], i, s->first_coded_c_fragment, s->last_coded_c_fragment, residual_eob_run); } @@ -1409,7 +1408,7 @@ static int unpack_dct_coeffs(Vp3DecodeContext *s, GetBitContext *gb) /* * This function reverses the DC prediction for each coded fragment in - * the frame. Much of this function is adapted directly from the original + * the frame. Much of this function is adapted directly from the original * VP3 source code. */ #define COMPATIBLE_FRAME(x) \ @@ -1421,7 +1420,7 @@ static inline int iabs (int x) { return ((x < 0) ? -x : x); } static void reverse_dc_prediction(Vp3DecodeContext *s, int first_fragment, int fragment_width, - int fragment_height) + int fragment_height) { #define PUL 8 @@ -1441,7 +1440,7 @@ static void reverse_dc_prediction(Vp3DecodeContext *s, * 10000000004 * 10000000004 * - * Note: Groups 5 and 7 do not exist as it would mean that the + * Note: Groups 5 and 7 do not exist as it would mean that the * fragment's x coordinate is both 0 and (width - 1) at the same time. */ int predictor_group; @@ -1456,7 +1455,7 @@ static void reverse_dc_prediction(Vp3DecodeContext *s, /* indices for the left, up-left, up, and up-right fragments */ int l, ul, u, ur; - /* + /* * The 6 fields mean: * 0: up-left multiplier * 1: up multiplier @@ -1487,7 +1486,7 @@ static void reverse_dc_prediction(Vp3DecodeContext *s, /* This table shows which types of blocks can use other blocks for * prediction. For example, INTRA is the only mode in this table to * have a frame number of 0. That means INTRA blocks can only predict - * from other INTRA blocks. There are 2 golden frame coding types; + * from other INTRA blocks. There are 2 golden frame coding types; * blocks encoding in these modes can only predict from other blocks * that were encoded with these 1 of these 2 modes. */ unsigned char compatible_frame[8] = { @@ -1521,7 +1520,7 @@ static void reverse_dc_prediction(Vp3DecodeContext *s, /* reverse prediction if this block was coded */ if (s->all_fragments[i].coding_method != MODE_COPY) { - current_frame_type = + current_frame_type = compatible_frame[s->all_fragments[i].coding_method]; predictor_group = (x == 0) + ((y == 0) << 1) + ((x + 1 == fragment_width) << 2); @@ -1639,7 +1638,7 @@ static void reverse_dc_prediction(Vp3DecodeContext *s, /* if there were no fragments to predict from, use last * DC saved */ predicted_dc = last_dc[current_frame_type]; - debug_dc_pred("from last DC (%d) = %d\n", + debug_dc_pred("from last DC (%d) = %d\n", current_frame_type, DC_COEFF(i)); } else { @@ -1654,7 +1653,7 @@ static void reverse_dc_prediction(Vp3DecodeContext *s, /* if there is a shift value in the transform, add * the sign bit before the shift */ if (predictor_transform[transform][5] != 0) { - predicted_dc += ((predicted_dc >> 15) & + predicted_dc += ((predicted_dc >> 15) & predictor_transform[transform][4]); predicted_dc >>= predictor_transform[transform][5]; } @@ -1670,7 +1669,7 @@ static void reverse_dc_prediction(Vp3DecodeContext *s, predicted_dc = vul; } - debug_dc_pred("from pred DC = %d\n", + debug_dc_pred("from pred DC = %d\n", DC_COEFF(i)); } @@ -1711,7 +1710,7 @@ static void render_slice(Vp3DecodeContext *s, int slice) int m, n; int i; /* indicates current fragment */ int16_t *dequantizer; - DCTELEM __align16 block[64]; + DECLARE_ALIGNED_16(DCTELEM, block[64]); unsigned char *output_plane; unsigned char *last_plane; unsigned char *golden_plane; @@ -1774,7 +1773,7 @@ static void render_slice(Vp3DecodeContext *s, int slice) i = s->macroblock_fragments[current_macroblock_entry + 5]; } fragment_width = plane_width / FRAGMENT_PIXELS; - + if(ABS(stride) > 2048) return; //various tables are fixed size @@ -1796,7 +1795,7 @@ static void render_slice(Vp3DecodeContext *s, int slice) if ((s->all_fragments[i].coding_method == MODE_USING_GOLDEN) || (s->all_fragments[i].coding_method == MODE_GOLDEN_MV)) motion_source= golden_plane; - else + else motion_source= last_plane; motion_source += s->all_fragments[i].first_pixel; @@ -1834,14 +1833,14 @@ static void render_slice(Vp3DecodeContext *s, int slice) motion_source= temp; } } - + /* first, take care of copying a block from either the * previous or the golden frame */ if (s->all_fragments[i].coding_method != MODE_INTRA) { - /* Note, it is possible to implement all MC cases with - put_no_rnd_pixels_l2 which would look more like the - VP3 source but this would be slower as + /* Note, it is possible to implement all MC cases with + put_no_rnd_pixels_l2 which would look more like the + VP3 source but this would be slower as put_no_rnd_pixels_tab is better optimzed */ if(motion_halfpel_index != 3){ s->dsp.put_no_rnd_pixels_tab[1][motion_halfpel_index]( @@ -1851,8 +1850,8 @@ static void render_slice(Vp3DecodeContext *s, int slice) int d= (motion_x ^ motion_y)>>31; // d is 0 if motion_x and _y have the same sign, else -1 s->dsp.put_no_rnd_pixels_l2[1]( output_plane + s->all_fragments[i].first_pixel, - motion_source - d, - motion_source + stride + 1 + d, + motion_source - d, + motion_source + stride + 1 + d, stride, 8); } dequantizer = s->inter_dequant; @@ -1864,8 +1863,8 @@ static void render_slice(Vp3DecodeContext *s, int slice) } /* dequantize the DCT coefficients */ - debug_idct("fragment %d, coding mode %d, DC = %d, dequant = %d:\n", - i, s->all_fragments[i].coding_method, + debug_idct("fragment %d, coding mode %d, DC = %d, dequant = %d:\n", + i, s->all_fragments[i].coding_method, DC_COEFF(i), dequantizer[0]); if(s->avctx->idct_algo==FF_IDCT_VP3){ @@ -1885,7 +1884,7 @@ static void render_slice(Vp3DecodeContext *s, int slice) } /* invert DCT and place (or add) in final output */ - + if (s->all_fragments[i].coding_method == MODE_INTRA) { if(s->avctx->idct_algo!=FF_IDCT_VP3) block[0] += 128<<3; @@ -1905,7 +1904,7 @@ static void render_slice(Vp3DecodeContext *s, int slice) "put" : "add"); for (m = 0; m < 8; m++) { for (n = 0; n < 8; n++) { - debug_idct(" %3d", *(output_plane + + debug_idct(" %3d", *(output_plane + s->all_fragments[i].first_pixel + (m * stride + n))); } debug_idct("\n"); @@ -1976,7 +1975,7 @@ static void horizontal_filter(unsigned char *first_pixel, int stride, int filter_value; for (end= first_pixel + 8*stride; first_pixel < end; first_pixel += stride) { - filter_value = + filter_value = (first_pixel[-2] - first_pixel[ 1]) +3*(first_pixel[ 0] - first_pixel[-1]); filter_value = bounding_values[(filter_value + 4) >> 3]; @@ -1993,7 +1992,7 @@ static void vertical_filter(unsigned char *first_pixel, int stride, const int nstride= -stride; for (end= first_pixel + 8; first_pixel < end; first_pixel++) { - filter_value = + filter_value = (first_pixel[2 * nstride] - first_pixel[ stride]) +3*(first_pixel[0 ] - first_pixel[nstride]); filter_value = bounding_values[(filter_value + 4) >> 3]; @@ -2065,7 +2064,7 @@ START_TIMER if ((x > 0) && (s->all_fragments[fragment].coding_method != MODE_COPY)) { horizontal_filter( - plane_data + s->all_fragments[fragment].first_pixel - 7*stride, + plane_data + s->all_fragments[fragment].first_pixel - 7*stride, stride, bounding_values); } @@ -2073,7 +2072,7 @@ START_TIMER if ((y > 0) && (s->all_fragments[fragment].coding_method != MODE_COPY)) { vertical_filter( - plane_data + s->all_fragments[fragment].first_pixel + stride, + plane_data + s->all_fragments[fragment].first_pixel + stride, stride, bounding_values); } @@ -2084,7 +2083,7 @@ START_TIMER (s->all_fragments[fragment].coding_method != MODE_COPY) && (s->all_fragments[fragment + 1].coding_method == MODE_COPY)) { horizontal_filter( - plane_data + s->all_fragments[fragment + 1].first_pixel - 7*stride, + plane_data + s->all_fragments[fragment + 1].first_pixel - 7*stride, stride, bounding_values); } @@ -2095,7 +2094,7 @@ START_TIMER (s->all_fragments[fragment].coding_method != MODE_COPY) && (s->all_fragments[fragment + width].coding_method == MODE_COPY)) { vertical_filter( - plane_data + s->all_fragments[fragment + width].first_pixel + stride, + plane_data + s->all_fragments[fragment + width].first_pixel + stride, stride, bounding_values); } @@ -2106,12 +2105,12 @@ STOP_TIMER("loop filter") } } -/* +/* * This function computes the first pixel addresses for each fragment. * This function needs to be invoked after the first frame is allocated * so that it has access to the plane strides. */ -static void vp3_calculate_pixel_addresses(Vp3DecodeContext *s) +static void vp3_calculate_pixel_addresses(Vp3DecodeContext *s) { int i, x, y; @@ -2121,11 +2120,11 @@ static void vp3_calculate_pixel_addresses(Vp3DecodeContext *s) i = 0; for (y = s->fragment_height; y > 0; y--) { for (x = 0; x < s->fragment_width; x++) { - s->all_fragments[i++].first_pixel = + s->all_fragments[i++].first_pixel = s->golden_frame.linesize[0] * y * FRAGMENT_PIXELS - s->golden_frame.linesize[0] + x * FRAGMENT_PIXELS; - debug_init(" fragment %d, first pixel @ %d\n", + debug_init(" fragment %d, first pixel @ %d\n", i-1, s->all_fragments[i-1].first_pixel); } } @@ -2134,11 +2133,11 @@ static void vp3_calculate_pixel_addresses(Vp3DecodeContext *s) i = s->u_fragment_start; for (y = s->fragment_height / 2; y > 0; y--) { for (x = 0; x < s->fragment_width / 2; x++) { - s->all_fragments[i++].first_pixel = + s->all_fragments[i++].first_pixel = s->golden_frame.linesize[1] * y * FRAGMENT_PIXELS - s->golden_frame.linesize[1] + x * FRAGMENT_PIXELS; - debug_init(" fragment %d, first pixel @ %d\n", + debug_init(" fragment %d, first pixel @ %d\n", i-1, s->all_fragments[i-1].first_pixel); } } @@ -2147,18 +2146,18 @@ static void vp3_calculate_pixel_addresses(Vp3DecodeContext *s) i = s->v_fragment_start; for (y = s->fragment_height / 2; y > 0; y--) { for (x = 0; x < s->fragment_width / 2; x++) { - s->all_fragments[i++].first_pixel = + s->all_fragments[i++].first_pixel = s->golden_frame.linesize[2] * y * FRAGMENT_PIXELS - s->golden_frame.linesize[2] + x * FRAGMENT_PIXELS; - debug_init(" fragment %d, first pixel @ %d\n", + debug_init(" fragment %d, first pixel @ %d\n", i-1, s->all_fragments[i-1].first_pixel); } } } /* FIXME: this should be merged with the above! */ -static void theora_calculate_pixel_addresses(Vp3DecodeContext *s) +static void theora_calculate_pixel_addresses(Vp3DecodeContext *s) { int i, x, y; @@ -2168,11 +2167,11 @@ static void theora_calculate_pixel_addresses(Vp3DecodeContext *s) i = 0; for (y = 1; y <= s->fragment_height; y++) { for (x = 0; x < s->fragment_width; x++) { - s->all_fragments[i++].first_pixel = + s->all_fragments[i++].first_pixel = s->golden_frame.linesize[0] * y * FRAGMENT_PIXELS - s->golden_frame.linesize[0] + x * FRAGMENT_PIXELS; - debug_init(" fragment %d, first pixel @ %d\n", + debug_init(" fragment %d, first pixel @ %d\n", i-1, s->all_fragments[i-1].first_pixel); } } @@ -2181,11 +2180,11 @@ static void theora_calculate_pixel_addresses(Vp3DecodeContext *s) i = s->u_fragment_start; for (y = 1; y <= s->fragment_height / 2; y++) { for (x = 0; x < s->fragment_width / 2; x++) { - s->all_fragments[i++].first_pixel = + s->all_fragments[i++].first_pixel = s->golden_frame.linesize[1] * y * FRAGMENT_PIXELS - s->golden_frame.linesize[1] + x * FRAGMENT_PIXELS; - debug_init(" fragment %d, first pixel @ %d\n", + debug_init(" fragment %d, first pixel @ %d\n", i-1, s->all_fragments[i-1].first_pixel); } } @@ -2194,11 +2193,11 @@ static void theora_calculate_pixel_addresses(Vp3DecodeContext *s) i = s->v_fragment_start; for (y = 1; y <= s->fragment_height / 2; y++) { for (x = 0; x < s->fragment_width / 2; x++) { - s->all_fragments[i++].first_pixel = + s->all_fragments[i++].first_pixel = s->golden_frame.linesize[2] * y * FRAGMENT_PIXELS - s->golden_frame.linesize[2] + x * FRAGMENT_PIXELS; - debug_init(" fragment %d, first pixel @ %d\n", + debug_init(" fragment %d, first pixel @ %d\n", i-1, s->all_fragments[i-1].first_pixel); } } @@ -2217,9 +2216,9 @@ static int vp3_decode_init(AVCodecContext *avctx) int c_superblock_count; if (avctx->codec_tag == MKTAG('V','P','3','0')) - s->version = 0; + s->version = 0; else - s->version = 1; + s->version = 1; s->avctx = avctx; s->width = (avctx->width + 15) & 0xFFFFFFF0; @@ -2229,7 +2228,7 @@ static int vp3_decode_init(AVCodecContext *avctx) if(avctx->idct_algo==FF_IDCT_AUTO) avctx->idct_algo=FF_IDCT_VP3; dsputil_init(&s->dsp, avctx); - + ff_init_scantable(s->dsp.idct_permutation, &s->scantable, ff_zigzag_direct); /* initialize to an impossible value which will force a recalculation @@ -2270,7 +2269,7 @@ static int vp3_decode_init(AVCodecContext *avctx) s->y_superblock_width, s->y_superblock_height, y_superblock_count); debug_init(" C superblocks: %d x %d, %d total\n", s->c_superblock_width, s->c_superblock_height, c_superblock_count); - debug_init(" total superblocks = %d, U starts @ %d, V starts @ %d\n", + debug_init(" total superblocks = %d, U starts @ %d, V starts @ %d\n", s->superblock_count, s->u_superblock_start, s->v_superblock_start); debug_init(" macroblocks: %d x %d, %d total\n", s->macroblock_width, s->macroblock_height, s->macroblock_count); @@ -2288,18 +2287,18 @@ static int vp3_decode_init(AVCodecContext *avctx) if (!s->theora_tables) { - for (i = 0; i < 64; i++) - s->coded_dc_scale_factor[i] = vp31_dc_scale_factor[i]; - for (i = 0; i < 64; i++) - s->coded_ac_scale_factor[i] = vp31_ac_scale_factor[i]; - for (i = 0; i < 64; i++) - s->coded_intra_y_dequant[i] = vp31_intra_y_dequant[i]; - for (i = 0; i < 64; i++) - s->coded_intra_c_dequant[i] = vp31_intra_c_dequant[i]; - for (i = 0; i < 64; i++) - s->coded_inter_dequant[i] = vp31_inter_dequant[i]; - for (i = 0; i < 64; i++) - s->filter_limit_values[i] = vp31_filter_limit_values[i]; + for (i = 0; i < 64; i++) + s->coded_dc_scale_factor[i] = vp31_dc_scale_factor[i]; + for (i = 0; i < 64; i++) + s->coded_ac_scale_factor[i] = vp31_ac_scale_factor[i]; + for (i = 0; i < 64; i++) + s->coded_intra_y_dequant[i] = vp31_intra_y_dequant[i]; + for (i = 0; i < 64; i++) + s->coded_intra_c_dequant[i] = vp31_intra_c_dequant[i]; + for (i = 0; i < 64; i++) + s->coded_inter_dequant[i] = vp31_inter_dequant[i]; + for (i = 0; i < 64; i++) + s->filter_limit_values[i] = vp31_filter_limit_values[i]; /* init VLC tables */ for (i = 0; i < 16; i++) { @@ -2363,7 +2362,7 @@ static int vp3_decode_init(AVCodecContext *avctx) &superblock_run_length_vlc_table[0][1], 4, 2, &superblock_run_length_vlc_table[0][0], 4, 2, 0); - init_vlc(&s->fragment_run_length_vlc, 5, 31, + init_vlc(&s->fragment_run_length_vlc, 5, 30, &fragment_run_length_vlc_table[0][1], 4, 2, &fragment_run_length_vlc_table[0][0], 4, 2, 0); @@ -2394,7 +2393,7 @@ static int vp3_decode_init(AVCodecContext *avctx) /* * This is the ffmpeg/libavcodec API frame decode function. */ -static int vp3_decode_frame(AVCodecContext *avctx, +static int vp3_decode_frame(AVCodecContext *avctx, void *data, int *data_size, uint8_t *buf, int buf_size) { @@ -2404,39 +2403,44 @@ static int vp3_decode_frame(AVCodecContext *avctx, int i; init_get_bits(&gb, buf, buf_size * 8); - + if (s->theora && get_bits1(&gb)) { - int ptype = get_bits(&gb, 7); - - skip_bits(&gb, 6*8); /* "theora" */ - - switch(ptype) - { - case 1: - theora_decode_comments(avctx, gb); - break; - case 2: - theora_decode_tables(avctx, gb); - init_dequantizer(s); - break; - default: - av_log(avctx, AV_LOG_ERROR, "Unknown Theora config packet: %d\n", ptype); - } - return buf_size; +#if 1 + av_log(avctx, AV_LOG_ERROR, "Header packet passed to frame decoder, skipping\n"); + return -1; +#else + int ptype = get_bits(&gb, 7); + + skip_bits(&gb, 6*8); /* "theora" */ + + switch(ptype) + { + case 1: + theora_decode_comments(avctx, gb); + break; + case 2: + theora_decode_tables(avctx, gb); + init_dequantizer(s); + break; + default: + av_log(avctx, AV_LOG_ERROR, "Unknown Theora config packet: %d\n", ptype); + } + return buf_size; +#endif } s->keyframe = !get_bits1(&gb); if (!s->theora) - skip_bits(&gb, 1); + skip_bits(&gb, 1); s->last_quality_index = s->quality_index; s->quality_index = get_bits(&gb, 6); if (s->theora >= 0x030200) skip_bits1(&gb); if (s->avctx->debug & FF_DEBUG_PICT_INFO) - av_log(s->avctx, AV_LOG_INFO, " VP3 %sframe #%d: Q index = %d\n", - s->keyframe?"key":"", counter, s->quality_index); + av_log(s->avctx, AV_LOG_INFO, " VP3 %sframe #%d: Q index = %d\n", + s->keyframe?"key":"", counter, s->quality_index); counter++; if (s->quality_index != s->last_quality_index) { @@ -2445,23 +2449,23 @@ static int vp3_decode_frame(AVCodecContext *avctx, } if (s->keyframe) { - if (!s->theora) - { - skip_bits(&gb, 4); /* width code */ - skip_bits(&gb, 4); /* height code */ - if (s->version) - { - s->version = get_bits(&gb, 5); - if (counter == 1) - av_log(s->avctx, AV_LOG_DEBUG, "VP version: %d\n", s->version); - } - } - if (s->version || s->theora) - { - if (get_bits1(&gb)) - av_log(s->avctx, AV_LOG_ERROR, "Warning, unsupported keyframe coding type?!\n"); - skip_bits(&gb, 2); /* reserved? */ - } + if (!s->theora) + { + skip_bits(&gb, 4); /* width code */ + skip_bits(&gb, 4); /* height code */ + if (s->version) + { + s->version = get_bits(&gb, 5); + if (counter == 1) + av_log(s->avctx, AV_LOG_DEBUG, "VP version: %d\n", s->version); + } + } + if (s->version || s->theora) + { + if (get_bits1(&gb)) + av_log(s->avctx, AV_LOG_ERROR, "Warning, unsupported keyframe coding type?!\n"); + skip_bits(&gb, 2); /* reserved? */ + } if (s->last_frame.data[0] == s->golden_frame.data[0]) { if (s->golden_frame.data[0]) @@ -2485,12 +2489,12 @@ static int vp3_decode_frame(AVCodecContext *avctx, /* time to figure out pixel addresses? */ if (!s->pixel_addresses_inited) - { - if (!s->flipped_image) - vp3_calculate_pixel_addresses(s); - else - theora_calculate_pixel_addresses(s); - } + { + if (!s->flipped_image) + vp3_calculate_pixel_addresses(s); + else + theora_calculate_pixel_addresses(s); + } } else { /* allocate a new current frame */ s->current_frame.reference = 3; @@ -2597,7 +2601,7 @@ static int vp3_decode_end(AVCodecContext *avctx) av_free(s->superblock_macroblocks); av_free(s->macroblock_fragments); av_free(s->macroblock_coding); - + /* release all frames */ if (s->golden_frame.data[0] && s->golden_frame.data[0] != s->last_frame.data[0]) avctx->release_buffer(avctx, &s->golden_frame); @@ -2650,7 +2654,7 @@ static int theora_decode_header(AVCodecContext *avctx, GetBitContext gb) minor = get_bits(&gb, 8); /* version minor */ micro = get_bits(&gb, 8); /* version micro */ av_log(avctx, AV_LOG_INFO, "Theora bitstream version %d.%d.%d\n", - major, minor, micro); + major, minor, micro); /* FIXME: endianess? */ s->theora = (major << 16) | (minor << 8) | micro; @@ -2659,20 +2663,35 @@ static int theora_decode_header(AVCodecContext *avctx, GetBitContext gb) /* but previous versions have the image flipped relative to vp3 */ if (s->theora < 0x030200) { - s->flipped_image = 1; + s->flipped_image = 1; av_log(avctx, AV_LOG_DEBUG, "Old (width = get_bits(&gb, 16) << 4; s->height = get_bits(&gb, 16) << 4; - + if(avcodec_check_dimensions(avctx, s->width, s->height)){ + av_log(avctx, AV_LOG_ERROR, "Invalid dimensions (%dx%d)\n", s->width, s->height); s->width= s->height= 0; return -1; } - - skip_bits(&gb, 24); /* frame width */ - skip_bits(&gb, 24); /* frame height */ + + if (s->theora >= 0x030400) + { + skip_bits(&gb, 32); /* total number of superblocks in a frame */ + // fixme, the next field is 36bits long + skip_bits(&gb, 32); /* total number of blocks in a frame */ + skip_bits(&gb, 4); /* total number of blocks in a frame */ + skip_bits(&gb, 32); /* total number of macroblocks in a frame */ + + skip_bits(&gb, 24); /* frame width */ + skip_bits(&gb, 24); /* frame height */ + } + else + { + skip_bits(&gb, 24); /* frame width */ + skip_bits(&gb, 24); /* frame height */ + } skip_bits(&gb, 8); /* offset x */ skip_bits(&gb, 8); /* offset y */ @@ -2681,54 +2700,46 @@ static int theora_decode_header(AVCodecContext *avctx, GetBitContext gb) skip_bits(&gb, 32); /* fps denumerator */ skip_bits(&gb, 24); /* aspect numerator */ skip_bits(&gb, 24); /* aspect denumerator */ - + if (s->theora < 0x030200) - skip_bits(&gb, 5); /* keyframe frequency force */ + skip_bits(&gb, 5); /* keyframe frequency force */ skip_bits(&gb, 8); /* colorspace */ + if (s->theora >= 0x030400) + skip_bits(&gb, 2); /* pixel format: 420,res,422,444 */ skip_bits(&gb, 24); /* bitrate */ - skip_bits(&gb, 6); /* last(?) quality index */ - + skip_bits(&gb, 6); /* quality hint */ + if (s->theora >= 0x030200) { - skip_bits(&gb, 5); /* keyframe frequency force */ - skip_bits(&gb, 5); /* spare bits */ + skip_bits(&gb, 5); /* keyframe frequency force */ + + if (s->theora < 0x030400) + skip_bits(&gb, 5); /* spare bits */ } - + // align_get_bits(&gb); - + avctx->width = s->width; avctx->height = s->height; return 0; } -static int theora_decode_comments(AVCodecContext *avctx, GetBitContext gb) +static inline int theora_get_32bit(GetBitContext gb) { - int nb_comments, i, tmp; - - tmp = get_bits_long(&gb, 32); - tmp = be2me_32(tmp); - while(tmp--) - skip_bits(&gb, 8); + int ret = get_bits(&gb, 8); + ret += get_bits(&gb, 8) << 8; + ret += get_bits(&gb, 8) << 16; + ret += get_bits(&gb, 8) << 24; - nb_comments = get_bits_long(&gb, 32); - nb_comments = be2me_32(nb_comments); - for (i = 0; i < nb_comments; i++) - { - tmp = get_bits_long(&gb, 32); - tmp = be2me_32(tmp); - while(tmp--) - skip_bits(&gb, 8); - } - - return 0; + return ret; } static int theora_decode_tables(AVCodecContext *avctx, GetBitContext gb) { Vp3DecodeContext *s = avctx->priv_data; - int i, n; + int i, n, matrices; if (s->theora >= 0x030200) { n = get_bits(&gb, 3); @@ -2736,14 +2747,14 @@ static int theora_decode_tables(AVCodecContext *avctx, GetBitContext gb) for (i = 0; i < 64; i++) s->filter_limit_values[i] = get_bits(&gb, n); } - + if (s->theora >= 0x030200) n = get_bits(&gb, 4) + 1; else n = 16; /* quality threshold table */ for (i = 0; i < 64; i++) - s->coded_ac_scale_factor[i] = get_bits(&gb, n); + s->coded_ac_scale_factor[i] = get_bits(&gb, n); if (s->theora >= 0x030200) n = get_bits(&gb, 4) + 1; @@ -2751,29 +2762,34 @@ static int theora_decode_tables(AVCodecContext *avctx, GetBitContext gb) n = 16; /* dc scale factor table */ for (i = 0; i < 64; i++) - s->coded_dc_scale_factor[i] = get_bits(&gb, n); + s->coded_dc_scale_factor[i] = get_bits(&gb, n); if (s->theora >= 0x030200) - n = get_bits(&gb, 9) + 1; + matrices = get_bits(&gb, 9) + 1; else - n = 3; - if (n != 3) { - av_log(NULL,AV_LOG_ERROR, "unsupported nbms : %d\n", n); - return -1; + matrices = 3; + if (matrices != 3) { + av_log(avctx,AV_LOG_ERROR, "unsupported matrices: %d\n", matrices); +// return -1; } /* y coeffs */ for (i = 0; i < 64; i++) - s->coded_intra_y_dequant[i] = get_bits(&gb, 8); + s->coded_intra_y_dequant[i] = get_bits(&gb, 8); /* uv coeffs */ for (i = 0; i < 64; i++) - s->coded_intra_c_dequant[i] = get_bits(&gb, 8); + s->coded_intra_c_dequant[i] = get_bits(&gb, 8); /* inter coeffs */ for (i = 0; i < 64; i++) - s->coded_inter_dequant[i] = get_bits(&gb, 8); + s->coded_inter_dequant[i] = get_bits(&gb, 8); + + /* skip unknown matrices */ + n = matrices - 3; + while(n--) + for (i = 0; i < 64; i++) + skip_bits(&gb, 8); - /* Huffman tables */ for (i = 0; i <= 1; i++) { for (n = 0; n <= 2; n++) { int newqr; @@ -2787,17 +2803,20 @@ static int theora_decode_tables(AVCodecContext *avctx, GetBitContext gb) } else { int qi = 0; - skip_bits(&gb, av_log2(2)+1); + skip_bits(&gb, av_log2(matrices-1)+1); while (qi < 63) { qi += get_bits(&gb, av_log2(63-qi)+1) + 1; - skip_bits(&gb, av_log2(2)+1); + skip_bits(&gb, av_log2(matrices-1)+1); + } + if (qi > 63) { + av_log(avctx, AV_LOG_ERROR, "invalid qi %d > 63\n", qi); + return -1; } - if (qi > 63) - av_log(NULL, AV_LOG_ERROR, "error...\n"); } } } + /* Huffman tables */ for (s->hti = 0; s->hti < 80; s->hti++) { s->entries = 0; s->huff_code_size = 1; @@ -2808,9 +2827,9 @@ static int theora_decode_tables(AVCodecContext *avctx, GetBitContext gb) read_huffman_tree(avctx, &gb); } } - + s->theora_tables = 1; - + return 0; } @@ -2821,11 +2840,14 @@ static int theora_decode_init(AVCodecContext *avctx) int ptype; uint8_t *p= avctx->extradata; int op_bytes, i; - + s->theora = 1; if (!avctx->extradata_size) - return -1; + { + av_log(avctx, AV_LOG_ERROR, "Missing extradata!\n"); + return -1; + } for(i=0;i<3;i++) { op_bytes = *(p++)<<8; @@ -2836,23 +2858,31 @@ static int theora_decode_init(AVCodecContext *avctx) ptype = get_bits(&gb, 8); debug_vp3("Theora headerpacket type: %x\n", ptype); - - if (!(ptype & 0x80)) - return -1; - + + if (!(ptype & 0x80)) + { + av_log(avctx, AV_LOG_ERROR, "Invalid extradata!\n"); + return -1; + } + + // FIXME: check for this aswell skip_bits(&gb, 6*8); /* "theora" */ - + switch(ptype) { case 0x80: theora_decode_header(avctx, gb); - break; - case 0x81: - theora_decode_comments(avctx, gb); - break; - case 0x82: - theora_decode_tables(avctx, gb); - break; + break; + case 0x81: +// FIXME: is this needed? it breaks sometimes +// theora_decode_comments(avctx, gb); + break; + case 0x82: + theora_decode_tables(avctx, gb); + break; + default: + av_log(avctx, AV_LOG_ERROR, "Unknown Theora config packet: %d\n", ptype&~0x80); + break; } }