static int mm_decode_frame(AVCodecContext *avctx, void *data, int *data_size, const uint8_t *buf, int buf_size) { MmContext *s = avctx->priv_data; const uint8_t *buf_end = buf+buf_size; int type; type = AV_RL16(&buf[0]); buf += MM_PREAMBLE_SIZE; buf_size -= MM_PREAMBLE_SIZE; switch(type) { case MM_TYPE_PALETTE : mm_decode_pal(s, buf, buf_end); return buf_size; case MM_TYPE_INTRA : mm_decode_intra(s, 0, 0, buf, buf_size); break; case MM_TYPE_INTRA_HH : mm_decode_intra(s, 1, 0, buf, buf_size); break; case MM_TYPE_INTRA_HHV : mm_decode_intra(s, 1, 1, buf, buf_size); break; case MM_TYPE_INTER : mm_decode_inter(s, 0, 0, buf, buf_size); break; case MM_TYPE_INTER_HH : mm_decode_inter(s, 1, 0, buf, buf_size); break; case MM_TYPE_INTER_HHV : mm_decode_inter(s, 1, 1, buf, buf_size); break; default : return -1; } memcpy(s->frame.data[1], s->palette, AVPALETTE_SIZE); *data_size = sizeof(AVFrame); *(AVFrame*)data = s->frame; return buf_size; }
static int mm_decode_frame(AVCodecContext *avctx, void *data, int *data_size, uint8_t *buf, int buf_size) { MmContext *s = avctx->priv_data; AVPaletteControl *palette_control = avctx->palctrl; int type; if (palette_control->palette_changed) { memcpy(s->frame.data[1], palette_control->palette, AVPALETTE_SIZE); palette_control->palette_changed = 0; } type = AV_RL16(&buf[0]); buf += MM_PREAMBLE_SIZE; buf_size -= MM_PREAMBLE_SIZE; switch(type) { case MM_TYPE_INTRA : mm_decode_intra(s, 0, 0, buf, buf_size); break; case MM_TYPE_INTRA_HH : mm_decode_intra(s, 1, 0, buf, buf_size); break; case MM_TYPE_INTRA_HHV : mm_decode_intra(s, 1, 1, buf, buf_size); break; case MM_TYPE_INTER : mm_decode_inter(s, 0, 0, buf, buf_size); break; case MM_TYPE_INTER_HH : mm_decode_inter(s, 1, 0, buf, buf_size); break; case MM_TYPE_INTER_HHV : mm_decode_inter(s, 1, 1, buf, buf_size); break; default : return -1; } *data_size = sizeof(AVFrame); *(AVFrame*)data = s->frame; return buf_size; }
static int mm_decode_frame(AVCodecContext *avctx, void *data, int *data_size, AVPacket *avpkt) { const uint8_t *buf = avpkt->data; int buf_size = avpkt->size; MmContext *s = avctx->priv_data; int type, res; if (buf_size < MM_PREAMBLE_SIZE) return AVERROR_INVALIDDATA; type = AV_RL16(&buf[0]); buf += MM_PREAMBLE_SIZE; buf_size -= MM_PREAMBLE_SIZE; bytestream2_init(&s->gb, buf, buf_size); if (avctx->reget_buffer(avctx, &s->frame) < 0) { av_log(avctx, AV_LOG_ERROR, "reget_buffer() failed\n"); return -1; } switch(type) { case MM_TYPE_PALETTE : res = mm_decode_pal(s); return buf_size; case MM_TYPE_INTRA : res = mm_decode_intra(s, 0, 0); break; case MM_TYPE_INTRA_HH : res = mm_decode_intra(s, 1, 0); break; case MM_TYPE_INTRA_HHV : res = mm_decode_intra(s, 1, 1); break; case MM_TYPE_INTER : res = mm_decode_inter(s, 0, 0); break; case MM_TYPE_INTER_HH : res = mm_decode_inter(s, 1, 0); break; case MM_TYPE_INTER_HHV : res = mm_decode_inter(s, 1, 1); break; default: res = AVERROR_INVALIDDATA; break; } if (res < 0) return res; memcpy(s->frame.data[1], s->palette, AVPALETTE_SIZE); *data_size = sizeof(AVFrame); *(AVFrame*)data = s->frame; return buf_size; }
static int mm_decode_frame(AVCodecContext *avctx, void *data, int *data_size, AVPacket *avpkt) { const uint8_t *buf = avpkt->data; int buf_size = avpkt->size; MmContext *s = avctx->priv_data; const uint8_t *buf_end = buf+buf_size; int type; type = AV_RL16(&buf[0]); buf += MM_PREAMBLE_SIZE; buf_size -= MM_PREAMBLE_SIZE; if (avctx->reget_buffer(avctx, &s->frame) < 0) { av_log(avctx, AV_LOG_ERROR, "reget_buffer() failed\n"); return -1; } switch(type) { case MM_TYPE_PALETTE : mm_decode_pal(s, buf, buf_end); return buf_size; case MM_TYPE_INTRA : mm_decode_intra(s, 0, 0, buf, buf_size); break; case MM_TYPE_INTRA_HH : mm_decode_intra(s, 1, 0, buf, buf_size); break; case MM_TYPE_INTRA_HHV : mm_decode_intra(s, 1, 1, buf, buf_size); break; case MM_TYPE_INTER : mm_decode_inter(s, 0, 0, buf, buf_size); break; case MM_TYPE_INTER_HH : mm_decode_inter(s, 1, 0, buf, buf_size); break; case MM_TYPE_INTER_HHV : mm_decode_inter(s, 1, 1, buf, buf_size); break; default : return -1; } memcpy(s->frame.data[1], s->palette, AVPALETTE_SIZE); *data_size = sizeof(AVFrame); *(AVFrame*)data = s->frame; return buf_size; }
static int mm_decode_frame(AVCodecContext *avctx, void *data, int *got_frame, AVPacket *avpkt) { const uint8_t *buf = avpkt->data; int buf_size = avpkt->size; MmContext *s = avctx->priv_data; int type, res; if (buf_size < MM_PREAMBLE_SIZE) return AVERROR_INVALIDDATA; type = AV_RL16(&buf[0]); buf += MM_PREAMBLE_SIZE; buf_size -= MM_PREAMBLE_SIZE; bytestream2_init(&s->gb, buf, buf_size); if ((res = ff_reget_buffer(avctx, s->frame)) < 0) return res; switch(type) { case MM_TYPE_PALETTE : mm_decode_pal(s); return avpkt->size; case MM_TYPE_INTRA : res = mm_decode_intra(s, 0, 0); break; case MM_TYPE_INTRA_HH : res = mm_decode_intra(s, 1, 0); break; case MM_TYPE_INTRA_HHV : res = mm_decode_intra(s, 1, 1); break; case MM_TYPE_INTER : res = mm_decode_inter(s, 0, 0); break; case MM_TYPE_INTER_HH : res = mm_decode_inter(s, 1, 0); break; case MM_TYPE_INTER_HHV : res = mm_decode_inter(s, 1, 1); break; default: res = AVERROR_INVALIDDATA; break; } if (res < 0) return res; memcpy(s->frame->data[1], s->palette, AVPALETTE_SIZE); if ((res = av_frame_ref(data, s->frame)) < 0) return res; *got_frame = 1; return avpkt->size; }