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;