Mercurial > libavcodec.hg
comparison rpza.c @ 1607:9ef0d51e809b libavcodec
Set buffer hints, use cr where available
author | rtognimp |
---|---|
date | Fri, 07 Nov 2003 21:21:36 +0000 |
parents | 932d306bf1dc |
children | 586b5c08863c |
comparison
equal
deleted
inserted
replaced
1606:a1ac8e675b95 | 1607:9ef0d51e809b |
---|---|
138 switch (opcode & 0xe0) { | 138 switch (opcode & 0xe0) { |
139 | 139 |
140 /* Skip blocks */ | 140 /* Skip blocks */ |
141 case 0x80: | 141 case 0x80: |
142 while (n_blocks--) { | 142 while (n_blocks--) { |
143 if (!s->avctx->cr_available) { | |
143 block_ptr = row_ptr + pixel_ptr; | 144 block_ptr = row_ptr + pixel_ptr; |
144 for (pixel_y = 0; pixel_y < 4; pixel_y++) { | 145 for (pixel_y = 0; pixel_y < 4; pixel_y++) { |
145 for (pixel_x = 0; pixel_x < 4; pixel_x++){ | 146 for (pixel_x = 0; pixel_x < 4; pixel_x++){ |
146 pixels[block_ptr] = prev_pixels[block_ptr]; | 147 pixels[block_ptr] = prev_pixels[block_ptr]; |
147 block_ptr++; | 148 block_ptr++; |
148 } | 149 } |
149 block_ptr += row_inc; | 150 block_ptr += row_inc; |
150 } | 151 } |
151 ADVANCE_BLOCK(); | 152 } |
153 ADVANCE_BLOCK(); | |
152 } | 154 } |
153 break; | 155 break; |
154 | 156 |
155 /* Fill blocks with one color */ | 157 /* Fill blocks with one color */ |
156 case 0xa0: | 158 case 0xa0: |
262 void *data, int *data_size, | 264 void *data, int *data_size, |
263 uint8_t *buf, int buf_size) | 265 uint8_t *buf, int buf_size) |
264 { | 266 { |
265 RpzaContext *s = (RpzaContext *)avctx->priv_data; | 267 RpzaContext *s = (RpzaContext *)avctx->priv_data; |
266 | 268 |
269 /* no supplementary picture */ | |
270 if (buf_size == 0) | |
271 return 0; | |
272 | |
267 s->buf = buf; | 273 s->buf = buf; |
268 s->size = buf_size; | 274 s->size = buf_size; |
269 | 275 |
270 s->frame.reference = 1; | 276 s->frame.reference = 1; |
277 s->frame.buffer_hints = FF_BUFFER_HINTS_VALID | FF_BUFFER_HINTS_PRESERVE; | |
278 if (avctx->cr_available) | |
279 s->frame.buffer_hints |= FF_BUFFER_HINTS_REUSABLE; | |
280 else | |
281 s->frame.buffer_hints |= FF_BUFFER_HINTS_READABLE; | |
271 if (avctx->get_buffer(avctx, &s->frame)) { | 282 if (avctx->get_buffer(avctx, &s->frame)) { |
272 av_log(avctx, AV_LOG_ERROR, " RPZA Video: get_buffer() failed\n"); | 283 av_log(avctx, AV_LOG_ERROR, " RPZA Video: get_buffer() failed\n"); |
273 return -1; | 284 return -1; |
274 } | 285 } |
275 | 286 |
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 | |
276 rpza_decode_stream(s); | 292 rpza_decode_stream(s); |
277 | 293 |
278 if (s->prev_frame.data[0]) | 294 if (s->prev_frame.data[0]) |
279 avctx->release_buffer(avctx, &s->prev_frame); | 295 avctx->release_buffer(avctx, &s->prev_frame); |
280 | 296 |
281 /* shuffle frames */ | 297 /* shuffle frames */ |
298 if (!avctx->cr_available) | |
282 s->prev_frame = s->frame; | 299 s->prev_frame = s->frame; |
283 | 300 |
284 *data_size = sizeof(AVFrame); | 301 *data_size = sizeof(AVFrame); |
285 *(AVFrame*)data = s->frame; | 302 *(AVFrame*)data = s->frame; |
286 | 303 |
305 sizeof(RpzaContext), | 322 sizeof(RpzaContext), |
306 rpza_decode_init, | 323 rpza_decode_init, |
307 NULL, | 324 NULL, |
308 rpza_decode_end, | 325 rpza_decode_end, |
309 rpza_decode_frame, | 326 rpza_decode_frame, |
310 CODEC_CAP_DR1, | 327 CODEC_CAP_DR1 | CODEC_CAP_CR, |
311 }; | 328 }; |