static int idcin_decode_frame(AVCodecContext *avctx, void *data, int *data_size, uint8_t *buf, int buf_size) { IdcinContext *s = (IdcinContext *)avctx->priv_data; AVPaletteControl *palette_control = avctx->palctrl; s->buf = buf; s->size = buf_size; if (s->frame.data[0]) avctx->release_buffer(avctx, &s->frame); if (avctx->get_buffer(avctx, &s->frame)) { av_log(avctx, AV_LOG_ERROR, " Id CIN Video: get_buffer() failed\n"); return -1; } idcin_decode_vlcs(s); /* make the palette available on the way out */ memcpy(s->frame.data[1], palette_control->palette, PALETTE_COUNT * 4); /* If palette changed inform application*/ if (palette_control->palette_changed) { palette_control->palette_changed = 0; s->frame.palette_has_changed = 1; } *data_size = sizeof(AVFrame); *(AVFrame*)data = s->frame; /* report that the buffer was completely consumed */ return buf_size; }
static int idcin_decode_frame(AVCodecContext *avctx, void *data, int *got_frame, AVPacket *avpkt) { const uint8_t *buf = avpkt->data; int buf_size = avpkt->size; IdcinContext *s = avctx->priv_data; const uint8_t *pal = av_packet_get_side_data(avpkt, AV_PKT_DATA_PALETTE, NULL); s->buf = buf; s->size = buf_size; if (s->frame.data[0]) avctx->release_buffer(avctx, &s->frame); if (ff_get_buffer(avctx, &s->frame)) { av_log(avctx, AV_LOG_ERROR, " id CIN Video: get_buffer() failed\n"); return -1; } idcin_decode_vlcs(s); if (pal) { s->frame.palette_has_changed = 1; memcpy(s->pal, pal, AVPALETTE_SIZE); } /* make the palette available on the way out */ memcpy(s->frame.data[1], s->pal, AVPALETTE_SIZE); *got_frame = 1; *(AVFrame*)data = s->frame; /* report that the buffer was completely consumed */ return buf_size; }
static int idcin_decode_frame(AVCodecContext *avctx, void *data, int *got_frame, AVPacket *avpkt) { const uint8_t *buf = avpkt->data; int buf_size = avpkt->size; IdcinContext *s = avctx->priv_data; const uint8_t *pal = av_packet_get_side_data(avpkt, AV_PKT_DATA_PALETTE, NULL); AVFrame *frame = data; int ret; s->buf = buf; s->size = buf_size; if ((ret = ff_get_buffer(avctx, frame, 0)) < 0) return ret; if (idcin_decode_vlcs(s, frame)) return AVERROR_INVALIDDATA; if (pal) { frame->palette_has_changed = 1; memcpy(s->pal, pal, AVPALETTE_SIZE); } /* make the palette available on the way out */ memcpy(frame->data[1], s->pal, AVPALETTE_SIZE); *got_frame = 1; /* report that the buffer was completely consumed */ return buf_size; }