comparison vp3.c @ 1227:184c480cefc3 libavcodec

fix decoder so that ffmpeg does not crash, at least not right away
author tmmm
date Tue, 06 May 2003 03:11:20 +0000
parents 3fa9a3de913f
children cefec170ee46
comparison
equal deleted inserted replaced
1226:dbc7e3c814a9 1227:184c480cefc3
208 #define MIN_DEQUANT_VAL 2 208 #define MIN_DEQUANT_VAL 2
209 209
210 typedef struct Vp3DecodeContext { 210 typedef struct Vp3DecodeContext {
211 AVCodecContext *avctx; 211 AVCodecContext *avctx;
212 int width, height; 212 int width, height;
213 unsigned char *current_picture[3]; /* picture structure */
214 int linesize[3];
215 AVFrame golden_frame; 213 AVFrame golden_frame;
216 AVFrame last_frame; 214 AVFrame last_frame;
217 AVFrame current_frame; 215 AVFrame current_frame;
218 int keyframe; 216 int keyframe;
219 DSPContext dsp; 217 DSPContext dsp;
1964 1962
1965 /* set up plane-specific parameters */ 1963 /* set up plane-specific parameters */
1966 if (plane == 0) { 1964 if (plane == 0) {
1967 dequantizer = s->intra_y_dequant; 1965 dequantizer = s->intra_y_dequant;
1968 output_plane = s->current_frame.data[0]; 1966 output_plane = s->current_frame.data[0];
1969 last_plane = s->current_frame.data[0]; 1967 last_plane = s->last_frame.data[0];
1970 golden_plane = s->current_frame.data[0]; 1968 golden_plane = s->golden_frame.data[0];
1971 stride = -s->current_frame.linesize[0]; 1969 stride = -s->current_frame.linesize[0];
1972 } else if (plane == 1) { 1970 } else if (plane == 1) {
1973 dequantizer = s->intra_c_dequant; 1971 dequantizer = s->intra_c_dequant;
1974 output_plane = s->current_frame.data[1]; 1972 output_plane = s->current_frame.data[1];
1975 last_plane = s->current_frame.data[1]; 1973 last_plane = s->last_frame.data[1];
1976 golden_plane = s->current_frame.data[1]; 1974 golden_plane = s->golden_frame.data[1];
1977 stride = -s->current_frame.linesize[1]; 1975 stride = -s->current_frame.linesize[1];
1978 } else { 1976 } else {
1979 dequantizer = s->intra_c_dequant; 1977 dequantizer = s->intra_c_dequant;
1980 output_plane = s->current_frame.data[2]; 1978 output_plane = s->current_frame.data[2];
1981 last_plane = s->current_frame.data[2]; 1979 last_plane = s->last_frame.data[2];
1982 golden_plane = s->current_frame.data[2]; 1980 golden_plane = s->golden_frame.data[2];
1983 stride = -s->current_frame.linesize[2]; 1981 stride = -s->current_frame.linesize[2];
1984 } 1982 }
1985 1983
1986 /* for each fragment row... */ 1984 /* for each fragment row... */
1987 for (y = 0; y < fragment_height; y++) { 1985 for (y = 0; y < fragment_height; y++) {
2187 s->superblock_macroblocks = av_malloc(s->superblock_count * 4 * sizeof(int)); 2185 s->superblock_macroblocks = av_malloc(s->superblock_count * 4 * sizeof(int));
2188 s->macroblock_fragments = av_malloc(s->macroblock_count * 6 * sizeof(int)); 2186 s->macroblock_fragments = av_malloc(s->macroblock_count * 6 * sizeof(int));
2189 s->macroblock_coded = av_malloc(s->macroblock_count + 1); 2187 s->macroblock_coded = av_malloc(s->macroblock_count + 1);
2190 init_block_mapping(s); 2188 init_block_mapping(s);
2191 2189
2190 /* make sure that frames are available to be freed on the first decode */
2191 if(avctx->get_buffer(avctx, &s->golden_frame) < 0) {
2192 printf("vp3: get_buffer() failed\n");
2193 return -1;
2194 }
2195
2192 return 0; 2196 return 0;
2193 } 2197 }
2194 2198
2195 /* 2199 /*
2196 * This is the ffmpeg/libavcodec API frame decode function. 2200 * This is the ffmpeg/libavcodec API frame decode function.
2218 debug_vp3(" VP3 frame #%d: Q index = %d", counter, s->quality_index); 2222 debug_vp3(" VP3 frame #%d: Q index = %d", counter, s->quality_index);
2219 counter++; 2223 counter++;
2220 2224
2221 if (s->keyframe) { 2225 if (s->keyframe) {
2222 /* release the previous golden frame and get a new one */ 2226 /* release the previous golden frame and get a new one */
2223 if (counter > 1) 2227 avctx->release_buffer(avctx, &s->golden_frame);
2224 avctx->release_buffer(avctx, &s->golden_frame);
2225 2228
2226 s->golden_frame.reference = 0; 2229 s->golden_frame.reference = 0;
2227 if(avctx->get_buffer(avctx, &s->golden_frame) < 0) { 2230 if(avctx->get_buffer(avctx, &s->golden_frame) < 0) {
2228 printf("vp3: get_buffer() failed\n"); 2231 printf("vp3: get_buffer() failed\n");
2229 return -1; 2232 return -1;
2230 } 2233 }
2231 2234
2232 /* last frame is hereby invalidated */
2233 avctx->release_buffer(avctx, &s->last_frame);
2234
2235 /* golden frame is also the current frame */ 2235 /* golden frame is also the current frame */
2236 s->current_frame = s->golden_frame; 2236 memcpy(&s->current_frame, &s->golden_frame, sizeof(AVFrame));
2237 2237
2238 /* time to figure out pixel addresses? */ 2238 /* time to figure out pixel addresses? */
2239 if (!s->pixel_addresses_inited) 2239 if (!s->pixel_addresses_inited)
2240 vp3_calculate_pixel_addresses(s); 2240 vp3_calculate_pixel_addresses(s);
2241 2241
2274 render_fragments(s, s->u_fragment_start, 2274 render_fragments(s, s->u_fragment_start,
2275 s->fragment_width / 2, s->fragment_height / 2, 1); 2275 s->fragment_width / 2, s->fragment_height / 2, 1);
2276 render_fragments(s, s->v_fragment_start, 2276 render_fragments(s, s->v_fragment_start,
2277 s->fragment_width / 2, s->fragment_height / 2, 2); 2277 s->fragment_width / 2, s->fragment_height / 2, 2);
2278 2278
2279
2280 *data_size=sizeof(AVFrame); 2279 *data_size=sizeof(AVFrame);
2281 *(AVFrame*)data= s->current_frame; 2280 *(AVFrame*)data= s->current_frame;
2282 2281
2283 /* release the last frame, if it was allocated */ 2282 /* release the last frame, if it was allocated */
2284 avctx->release_buffer(avctx, &s->last_frame); 2283 avctx->release_buffer(avctx, &s->last_frame);
2285 2284
2286 /* shuffle frames */ 2285 /* shuffle frames (last = current) */
2287 s->last_frame = s->current_frame; 2286 memcpy(&s->last_frame, &s->current_frame, sizeof(AVFrame));
2288 2287
2289 return buf_size; 2288 return buf_size;
2290 } 2289 }
2291 2290
2292 /* 2291 /*