[FFmpeg-devel] [PATCH] R10k deocder
Måns Rullgård
mans
Sat Jun 26 21:59:03 CEST 2010
"Zhou Zongyi"<zhouzy at os.pku.edu.cn> writes:
> Hi all,
>
> Major part copied from r210 decoder:
>
> Index: libavcodec/avcodec.h
> ===================================================================
> --- libavcodec/avcodec.h (revision 23711)
> +++ libavcodec/avcodec.h (working copy)
> @@ -204,6 +204,7 @@
> CODEC_ID_FLASHSV2,
> CODEC_ID_CDGRAPHICS,
> CODEC_ID_R210,
> + CODEC_ID_R10K,
> CODEC_ID_ANM,
> CODEC_ID_BINKVIDEO,
> CODEC_ID_IFF_ILBM,
Add new IDs at the end.
> Index: libavcodec/Makefile
> ===================================================================
> --- libavcodec/Makefile (revision 23711)
> +++ libavcodec/Makefile (working copy)
> @@ -282,6 +282,7 @@
> OBJS-$(CONFIG_QTRLE_DECODER) += qtrle.o
> OBJS-$(CONFIG_QTRLE_ENCODER) += qtrleenc.o
> OBJS-$(CONFIG_R210_DECODER) += r210dec.o
> +OBJS-$(CONFIG_R10K_DECODER) += r10kdec.o
> OBJS-$(CONFIG_RA_144_DECODER) += ra144dec.o ra144.o celp_filters.o
> OBJS-$(CONFIG_RA_144_ENCODER) += ra144enc.o ra144.o celp_filters.o
> OBJS-$(CONFIG_RA_288_DECODER) += ra288.o celp_math.o celp_filters.o
Alphabetical order please.
> +static av_cold int decode_init(AVCodecContext *avctx)
> +{
> + avctx->pix_fmt = PIX_FMT_RGB48;
Reminds me, Jason mentioned a horrible rgb48-related bug the other day.
> + avctx->bits_per_raw_sample = 10;
> +
> + avctx->coded_frame = avcodec_alloc_frame();
> +
> + return 0;
> +}
> +
> +static av_cold int decode_close(AVCodecContext *avctx)
> +{
> + AVFrame *pic = avctx->coded_frame;
> + if (pic->data[0])
> + avctx->release_buffer(avctx, pic);
> + av_freep(&avctx->coded_frame);
> +
> + return 0;
> +}
> +
> +static int decode_frame(AVCodecContext *avctx, void *data, int *data_size,
> + AVPacket *avpkt)
> +{
> + int h, w;
> + AVFrame *pic = avctx->coded_frame;
> + const uint32_t *src = (const uint32_t *)avpkt->data;
> + int aligned_width = FFALIGN(avctx->width, 64);
> + uint8_t *dst_line;
> +
> + if (pic->data[0])
> + avctx->release_buffer(avctx, pic);
> +
> + if (avpkt->size < 4 * aligned_width * avctx->height) {
> + av_log(avctx, AV_LOG_ERROR, "packet too small\n", avpkt->size);
> + return -1;
AVERROR(EINVAL)
> + }
> +
> + pic->reference = 0;
> + if (avctx->get_buffer(avctx, pic) < 0)
> + return -1;
Propagating the error code back to the caller would be nice.
> + pic->pict_type = FF_I_TYPE;
> + pic->key_frame = 1;
> + dst_line = pic->data[0];
> +
> + for (h = 0; h < avctx->height; h++) {
> + uint16_t *dst = (uint16_t *)dst_line;
> + for (w = 0; w < avctx->width; w++) {
> + uint32_t pixel = be2me_32(*src++);
We should add aligned versions of the AV_R[BL] macros...
> + *dst++ = (pixel >> 16) & 0xffc0;
> + *dst++ = (pixel >> 6) & 0xffc0;
> + *dst++ = pixel << 4;
> + }
> + src += aligned_width - avctx->width;
> + dst_line += pic->linesize[0];
> + }
> +
> + *data_size = sizeof(AVFrame);
> + *(AVFrame*)data = *avctx->coded_frame;
> +
> + return avpkt->size;
> +}
> +
> +AVCodec r10k_decoder = {
> + "r10k",
> + AVMEDIA_TYPE_VIDEO,
> + CODEC_ID_R10K,
> + 0,
> + decode_init,
> + NULL,
> + decode_close,
> + decode_frame,
> + CODEC_CAP_DR1,
> + .long_name = NULL_IF_CONFIG_SMALL("Uncompressed RGB 10-bit"),
> +};
--
M?ns Rullg?rd
mans at mansr.com
More information about the ffmpeg-devel
mailing list