aboutsummaryrefslogtreecommitdiffstats
path: root/libavcodec/vp3.c
diff options
context:
space:
mode:
authorMike Melanson <mike@multimedia.cx>2003-05-08 02:01:17 +0000
committerMike Melanson <mike@multimedia.cx>2003-05-08 02:01:17 +0000
commita466e345e41253aa2c8cf9d62ff32be8d2cde0fa (patch)
tree83b05ef0856b1f62e0334d7ff681170b6f4ad0b2 /libavcodec/vp3.c
parent5fd74135ad09891df45927d7a5785e3d4afb4e78 (diff)
downloadffmpeg-a466e345e41253aa2c8cf9d62ff32be8d2cde0fa.tar.gz
correct the custom coding mode alphabet, add some validation on the
motion vectors (which are not completely correct yet) Originally committed as revision 1844 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavcodec/vp3.c')
-rw-r--r--libavcodec/vp3.c50
1 files changed, 25 insertions, 25 deletions
diff --git a/libavcodec/vp3.c b/libavcodec/vp3.c
index e3d190e966..46a8b24f50 100644
--- a/libavcodec/vp3.c
+++ b/libavcodec/vp3.c
@@ -1287,7 +1287,7 @@ static void unpack_modes(Vp3DecodeContext *s, GetBitContext *gb)
if (scheme == 0) {
debug_modes(" custom mode alphabet ahead:\n");
for (i = 0; i < 8; i++)
- ModeAlphabet[0][i] = get_bits(gb, 3);
+ ModeAlphabet[scheme][get_bits(gb, 3)] = i;
}
for (i = 0; i < 8; i++)
@@ -1662,11 +1662,11 @@ static void unpack_dct_coeffs(Vp3DecodeContext *s, GetBitContext *gb)
residual_eob_run = unpack_vlcs(s, gb, &s->dc_vlc[dc_c_table], 0,
plane_split, s->coded_fragment_list_index, residual_eob_run);
- /* fetch the level 1 AC table indices */
+ /* fetch the AC table indices */
ac_y_table = get_bits(gb, 4);
ac_c_table = get_bits(gb, 4);
- /* unpack the level 1 AC coefficients (coeffs 1-5) */
+ /* unpack the group 1 AC coefficients (coeffs 1-5) */
for (i = 1; i <= 5; i++) {
debug_vp3(" vp3: unpacking level %d Y plane AC coefficients using table %d\n",
@@ -1680,7 +1680,7 @@ static void unpack_dct_coeffs(Vp3DecodeContext *s, GetBitContext *gb)
plane_split, s->coded_fragment_list_index, residual_eob_run);
}
- /* unpack the level 2 AC coefficients (coeffs 6-14) */
+ /* unpack the group 2 AC coefficients (coeffs 6-14) */
for (i = 6; i <= 14; i++) {
debug_vp3(" vp3: unpacking level %d Y plane AC coefficients using table %d\n",
@@ -1694,7 +1694,7 @@ static void unpack_dct_coeffs(Vp3DecodeContext *s, GetBitContext *gb)
plane_split, s->coded_fragment_list_index, residual_eob_run);
}
- /* unpack the level 3 AC coefficients (coeffs 15-27) */
+ /* unpack the group 3 AC coefficients (coeffs 15-27) */
for (i = 15; i <= 27; i++) {
debug_vp3(" vp3: unpacking level %d Y plane AC coefficients using table %d\n",
@@ -1708,7 +1708,7 @@ static void unpack_dct_coeffs(Vp3DecodeContext *s, GetBitContext *gb)
plane_split, s->coded_fragment_list_index, residual_eob_run);
}
- /* unpack the level 4 AC coefficients (coeffs 28-63) */
+ /* unpack the group 4 AC coefficients (coeffs 28-63) */
for (i = 28; i <= 63; i++) {
debug_vp3(" vp3: unpacking level %d Y plane AC coefficients using table %d\n",
@@ -1731,7 +1731,6 @@ static void unpack_dct_coeffs(Vp3DecodeContext *s, GetBitContext *gb)
#define COMPATIBLE_FRAME(x) \
(compatible_frame[s->all_fragments[x].coding_method] == current_frame_type)
#define FRAME_CODED(x) (s->all_fragments[x].coding_method != MODE_COPY)
-#define HIGHBITDUPPED(X) (((signed short) X) >> 15)
static inline int iabs (int x) { return ((x < 0) ? -x : x); }
static void reverse_dc_prediction(Vp3DecodeContext *s,
@@ -2020,7 +2019,7 @@ static void render_fragments(Vp3DecodeContext *s,
unsigned char *golden_plane;
int stride;
int motion_x, motion_y;
- int motion_x_limit, motion_y_limit;
+ int upper_motion_limit, lower_motion_limit;
int motion_halfpel_index;
unsigned int motion_source;
@@ -2034,23 +2033,26 @@ static void render_fragments(Vp3DecodeContext *s,
last_plane = s->last_frame.data[0];
golden_plane = s->golden_frame.data[0];
stride = -s->current_frame.linesize[0];
+ upper_motion_limit = 7 * s->current_frame.linesize[0];
+ lower_motion_limit = height * s->current_frame.linesize[0] + width - 8;
} else if (plane == 1) {
dequantizer = s->intra_c_dequant;
output_plane = s->current_frame.data[1];
last_plane = s->last_frame.data[1];
golden_plane = s->golden_frame.data[1];
stride = -s->current_frame.linesize[1];
+ upper_motion_limit = 7 * s->current_frame.linesize[1];
+ lower_motion_limit = height * s->current_frame.linesize[1] + width - 8;
} else {
dequantizer = s->intra_c_dequant;
output_plane = s->current_frame.data[2];
last_plane = s->last_frame.data[2];
golden_plane = s->golden_frame.data[2];
stride = -s->current_frame.linesize[2];
+ upper_motion_limit = 7 * s->current_frame.linesize[2];
+ lower_motion_limit = height * s->current_frame.linesize[2] + width - 8;
}
- motion_x_limit = width - 8;
- motion_y_limit = height - 8;
-
/* for each fragment row... */
for (y = 0; y < height; y += 8) {
@@ -2064,21 +2066,19 @@ static void render_fragments(Vp3DecodeContext *s,
motion_x = s->all_fragments[i].motion_x;
motion_y = s->all_fragments[i].motion_y;
motion_halfpel_index = s->all_fragments[i].motion_halfpel_index;
-/*
- if (motion_x < 0)
- motion_x = 0;
- if (motion_y < 0)
- motion_y = 0;
- if (motion_x > motion_x_limit)
- motion_x = motion_x_limit;
- if (motion_y > motion_y_limit)
- motion_y = motion_y_limit;
-*/
motion_source = s->all_fragments[i].first_pixel;
motion_source += motion_x;
motion_source += (motion_y * stride);
+ /* if the are any problems with a motion vector, refuse
+ * to render the block */
+ if ((motion_source < upper_motion_limit) ||
+ (motion_source > lower_motion_limit)) {
+// printf (" vp3: help! motion source (%d) out of range (%d..%d)\n",
+// motion_source, upper_motion_limit, lower_motion_limit);
+ }
+
/* first, take care of copying a block from either the
* previous or the golden frame */
if ((s->all_fragments[i].coding_method == MODE_USING_GOLDEN) ||
@@ -2270,22 +2270,22 @@ static int vp3_decode_init(AVCodecContext *avctx)
&dc_bias[i][0][1], 4, 2,
&dc_bias[i][0][0], 4, 2);
- /* level 1 AC histograms */
+ /* group 1 AC histograms */
init_vlc(&s->ac_vlc_1[i], 5, 32,
&ac_bias_0[i][0][1], 4, 2,
&ac_bias_0[i][0][0], 4, 2);
- /* level 2 AC histograms */
+ /* group 2 AC histograms */
init_vlc(&s->ac_vlc_2[i], 5, 32,
&ac_bias_1[i][0][1], 4, 2,
&ac_bias_1[i][0][0], 4, 2);
- /* level 3 AC histograms */
+ /* group 3 AC histograms */
init_vlc(&s->ac_vlc_3[i], 5, 32,
&ac_bias_2[i][0][1], 4, 2,
&ac_bias_2[i][0][0], 4, 2);
- /* level 4 AC histograms */
+ /* group 4 AC histograms */
init_vlc(&s->ac_vlc_4[i], 5, 32,
&ac_bias_3[i][0][1], 4, 2,
&ac_bias_3[i][0][0], 4, 2);