Mercurial > libavcodec.hg
comparison kmvc.c @ 3328:1eb35b97c056 libavcodec
Palette support for newer KMVC
author | kostya |
---|---|
date | Wed, 31 May 2006 04:52:02 +0000 |
parents | 226ffbb6fd02 |
children | 8765ee4eaa45 |
comparison
equal
deleted
inserted
replaced
3327:955096780e7c | 3328:1eb35b97c056 |
---|---|
240 if (avctx->get_buffer(avctx, &ctx->pic) < 0) { | 240 if (avctx->get_buffer(avctx, &ctx->pic) < 0) { |
241 av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n"); | 241 av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n"); |
242 return -1; | 242 return -1; |
243 } | 243 } |
244 | 244 |
245 header = buf[0]; | 245 header = *buf++; |
246 buf++; | 246 |
247 /* blocksize 127 is really palette change event */ | |
248 if (buf[0] == 127) { | |
249 buf += 3; | |
250 for (i = 0; i < 127; i++) { | |
251 ctx->pal[i + (header & 0x81)] = (buf[0] << 16) | (buf[1] << 8) | buf[2]; | |
252 buf += 4; | |
253 } | |
254 buf -= 127 * 4 + 3; | |
255 } | |
247 | 256 |
248 if (header & KMVC_KEYFRAME) { | 257 if (header & KMVC_KEYFRAME) { |
249 ctx->pic.key_frame = 1; | 258 ctx->pic.key_frame = 1; |
250 ctx->pic.pict_type = FF_I_TYPE; | 259 ctx->pic.pict_type = FF_I_TYPE; |
251 } else { | 260 } else { |
252 ctx->pic.key_frame = 0; | 261 ctx->pic.key_frame = 0; |
253 ctx->pic.pict_type = FF_P_TYPE; | 262 ctx->pic.pict_type = FF_P_TYPE; |
254 } | 263 } |
255 | 264 |
265 /* if palette has been changed, copy it from palctrl */ | |
266 if (ctx->avctx->palctrl && ctx->avctx->palctrl->palette_changed) { | |
267 memcpy(ctx->pal, ctx->avctx->palctrl->palette, AVPALETTE_SIZE); | |
268 ctx->setpal = 1; | |
269 ctx->avctx->palctrl->palette_changed = 0; | |
270 } | |
271 | |
256 if (header & KMVC_PALETTE) { | 272 if (header & KMVC_PALETTE) { |
257 ctx->pic.palette_has_changed = 1; | 273 ctx->pic.palette_has_changed = 1; |
258 // palette starts from index 1 and has 127 entries | 274 // palette starts from index 1 and has 127 entries |
259 for (i = 1; i <= ctx->palsize; i++) { | 275 for (i = 1; i <= ctx->palsize; i++) { |
260 ctx->pal[i] = (buf[0] << 16) | (buf[1] << 8) | buf[2]; | 276 ctx->pal[i] = (buf[0] << 16) | (buf[1] << 8) | buf[2]; |
270 /* make the palette available on the way out */ | 286 /* make the palette available on the way out */ |
271 memcpy(ctx->pic.data[1], ctx->pal, 1024); | 287 memcpy(ctx->pic.data[1], ctx->pal, 1024); |
272 | 288 |
273 blocksize = *buf++; | 289 blocksize = *buf++; |
274 | 290 |
275 if (blocksize != 8) { | 291 if (blocksize != 8 && blocksize != 127) { |
276 av_log(avctx, AV_LOG_ERROR, "Block size = %i\n", blocksize); | 292 av_log(avctx, AV_LOG_ERROR, "Block size = %i\n", blocksize); |
277 return -1; | 293 return -1; |
278 } | 294 } |
279 memset(ctx->cur, 0, 320 * 200); | 295 memset(ctx->cur, 0, 320 * 200); |
280 switch (header & KMVC_METHOD) { | 296 switch (header & KMVC_METHOD) { |
297 case 0: | |
298 case 1: // used in palette changed event | |
299 memcpy(ctx->cur, ctx->prev, 320 * 200); | |
300 break; | |
281 case 3: | 301 case 3: |
282 kmvc_decode_intra_8x8(ctx, buf, avctx->width, avctx->height); | 302 kmvc_decode_intra_8x8(ctx, buf, avctx->width, avctx->height); |
283 break; | 303 break; |
284 case 4: | 304 case 4: |
285 kmvc_decode_inter_8x8(ctx, buf, avctx->width, avctx->height); | 305 kmvc_decode_inter_8x8(ctx, buf, avctx->width, avctx->height); |
349 c->palsize = LE_16(avctx->extradata + 10); | 369 c->palsize = LE_16(avctx->extradata + 10); |
350 } | 370 } |
351 | 371 |
352 if (avctx->extradata_size == 1036) { // palette in extradata | 372 if (avctx->extradata_size == 1036) { // palette in extradata |
353 uint8_t *src = avctx->extradata + 12; | 373 uint8_t *src = avctx->extradata + 12; |
354 for (i = 0; i < c->palsize; i++) { | 374 for (i = 0; i < 256; i++) { |
355 c->pal[i] = LE_32(src); | 375 c->pal[i] = LE_32(src); |
356 src += 4; | 376 src += 4; |
357 } | 377 } |
358 c->setpal = 1; | 378 c->setpal = 1; |
379 if (c->avctx->palctrl) { | |
380 c->avctx->palctrl->palette_changed = 0; | |
381 } | |
359 } | 382 } |
360 | 383 |
361 avctx->pix_fmt = PIX_FMT_PAL8; | 384 avctx->pix_fmt = PIX_FMT_PAL8; |
362 | 385 |
363 return 0; | 386 return 0; |