comparison rpza.c @ 1630:586b5c08863c libavcodec

- Add reget_buffer() function to AVCodecContext - Add default reget_buffer implementation in libavcodec/utils.c - Remove AVCodecContext.cr_available, no longer needed - Remove CODEC_CAP_CR, no longer used - Add img_copy() prototype to avcodec.h (function from imgconvert.c) - Rename img_copy() to jpeg_img_copy() in libavformat/jpeg.c to avoid conflict - Updated msrle, msvideo1, rpza, smc to use reget_buffer
author rtognimp
date Wed, 26 Nov 2003 20:57:15 +0000
parents 9ef0d51e809b
children 1514fd5d434b
comparison
equal deleted inserted replaced
1629:74685a0ec851 1630:586b5c08863c
45 typedef struct RpzaContext { 45 typedef struct RpzaContext {
46 46
47 AVCodecContext *avctx; 47 AVCodecContext *avctx;
48 DSPContext dsp; 48 DSPContext dsp;
49 AVFrame frame; 49 AVFrame frame;
50 AVFrame prev_frame;
51 50
52 unsigned char *buf; 51 unsigned char *buf;
53 int size; 52 int size;
54 53
55 } RpzaContext; 54 } RpzaContext;
88 unsigned short colorA = 0, colorB; 87 unsigned short colorA = 0, colorB;
89 unsigned short color4[4]; 88 unsigned short color4[4];
90 unsigned char index, idx; 89 unsigned char index, idx;
91 unsigned short ta, tb; 90 unsigned short ta, tb;
92 unsigned short *pixels = (unsigned short *)s->frame.data[0]; 91 unsigned short *pixels = (unsigned short *)s->frame.data[0];
93 unsigned short *prev_pixels = (unsigned short *)s->prev_frame.data[0];
94 92
95 int row_ptr = 0; 93 int row_ptr = 0;
96 int pixel_ptr = 0; 94 int pixel_ptr = 0;
97 int block_ptr; 95 int block_ptr;
98 int pixel_x, pixel_y; 96 int pixel_x, pixel_y;
138 switch (opcode & 0xe0) { 136 switch (opcode & 0xe0) {
139 137
140 /* Skip blocks */ 138 /* Skip blocks */
141 case 0x80: 139 case 0x80:
142 while (n_blocks--) { 140 while (n_blocks--) {
143 if (!s->avctx->cr_available) {
144 block_ptr = row_ptr + pixel_ptr;
145 for (pixel_y = 0; pixel_y < 4; pixel_y++) {
146 for (pixel_x = 0; pixel_x < 4; pixel_x++){
147 pixels[block_ptr] = prev_pixels[block_ptr];
148 block_ptr++;
149 }
150 block_ptr += row_inc;
151 }
152 }
153 ADVANCE_BLOCK(); 141 ADVANCE_BLOCK();
154 } 142 }
155 break; 143 break;
156 144
157 /* Fill blocks with one color */ 145 /* Fill blocks with one color */
253 s->avctx = avctx; 241 s->avctx = avctx;
254 avctx->pix_fmt = PIX_FMT_RGB555; 242 avctx->pix_fmt = PIX_FMT_RGB555;
255 avctx->has_b_frames = 0; 243 avctx->has_b_frames = 0;
256 dsputil_init(&s->dsp, avctx); 244 dsputil_init(&s->dsp, avctx);
257 245
258 s->frame.data[0] = s->prev_frame.data[0] = NULL; 246 s->frame.data[0] = NULL;
259 247
260 return 0; 248 return 0;
261 } 249 }
262 250
263 static int rpza_decode_frame(AVCodecContext *avctx, 251 static int rpza_decode_frame(AVCodecContext *avctx,
272 260
273 s->buf = buf; 261 s->buf = buf;
274 s->size = buf_size; 262 s->size = buf_size;
275 263
276 s->frame.reference = 1; 264 s->frame.reference = 1;
277 s->frame.buffer_hints = FF_BUFFER_HINTS_VALID | FF_BUFFER_HINTS_PRESERVE; 265 s->frame.buffer_hints = FF_BUFFER_HINTS_VALID | FF_BUFFER_HINTS_PRESERVE | FF_BUFFER_HINTS_REUSABLE;
278 if (avctx->cr_available) 266 if (avctx->reget_buffer(avctx, &s->frame)) {
279 s->frame.buffer_hints |= FF_BUFFER_HINTS_REUSABLE; 267 av_log(avctx, AV_LOG_ERROR, "reget_buffer() failed\n");
280 else
281 s->frame.buffer_hints |= FF_BUFFER_HINTS_READABLE;
282 if (avctx->get_buffer(avctx, &s->frame)) {
283 av_log(avctx, AV_LOG_ERROR, " RPZA Video: get_buffer() failed\n");
284 return -1; 268 return -1;
285 } 269 }
286 270
287 if (s->prev_frame.data[0] &&(s->frame.linesize[0] != s->prev_frame.linesize[0]))
288 av_log(avctx, AV_LOG_ERROR, "Buffer linesize changed: current %u, previous %u.\n"
289 "Expect wrong image and/or crash!\n",
290 s->frame.linesize[0], s->prev_frame.linesize[0]);
291
292 rpza_decode_stream(s); 271 rpza_decode_stream(s);
293
294 if (s->prev_frame.data[0])
295 avctx->release_buffer(avctx, &s->prev_frame);
296
297 /* shuffle frames */
298 if (!avctx->cr_available)
299 s->prev_frame = s->frame;
300 272
301 *data_size = sizeof(AVFrame); 273 *data_size = sizeof(AVFrame);
302 *(AVFrame*)data = s->frame; 274 *(AVFrame*)data = s->frame;
303 275
304 /* always report that the buffer was completely consumed */ 276 /* always report that the buffer was completely consumed */
307 279
308 static int rpza_decode_end(AVCodecContext *avctx) 280 static int rpza_decode_end(AVCodecContext *avctx)
309 { 281 {
310 RpzaContext *s = (RpzaContext *)avctx->priv_data; 282 RpzaContext *s = (RpzaContext *)avctx->priv_data;
311 283
312 if (s->prev_frame.data[0]) 284 if (s->frame.data[0])
313 avctx->release_buffer(avctx, &s->prev_frame); 285 avctx->release_buffer(avctx, &s->frame);
314 286
315 return 0; 287 return 0;
316 } 288 }
317 289
318 AVCodec rpza_decoder = { 290 AVCodec rpza_decoder = {
322 sizeof(RpzaContext), 294 sizeof(RpzaContext),
323 rpza_decode_init, 295 rpza_decode_init,
324 NULL, 296 NULL,
325 rpza_decode_end, 297 rpza_decode_end,
326 rpza_decode_frame, 298 rpza_decode_frame,
327 CODEC_CAP_DR1 | CODEC_CAP_CR, 299 CODEC_CAP_DR1,
328 }; 300 };