예제 #1
0
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;
}
예제 #2
0
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;
}
예제 #3
0
파일: mmvideo.c 프로젝트: shanewfx/FFmpeg
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;
}
예제 #4
0
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;
}
예제 #5
0
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;
}