Mercurial > libavcodec.hg
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 /* |