[FFmpeg-devel] [PATCH] R10k deocder
Zhou Zongyi
zhouzy
Sat Jun 26 21:14:53 CEST 2010
Hi all,
Major part copied from r210 decoder:
Index: libavcodec/allcodecs.c
===================================================================
--- libavcodec/allcodecs.c (revision 23711)
+++ libavcodec/allcodecs.c (working copy)
@@ -160,6 +160,7 @@
REGISTER_DECODER (QDRAW, qdraw);
REGISTER_DECODER (QPEG, qpeg);
REGISTER_ENCDEC (QTRLE, qtrle);
+ REGISTER_DECODER (R10K, r10k);
REGISTER_DECODER (R210, r210);
REGISTER_ENCDEC (RAWVIDEO, rawvideo);
REGISTER_DECODER (RL2, rl2);
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,
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
Index: r10kdec.c
===================================================================
--- libavcodec/r10kdec.c (revision 0)
+++ libavcodec/r10kdec.c (revision 0)
@@ -0,0 +1,100 @@
+/*
+ * R10k decoder
+ *
+ * Copyright (C) 2010 Zongyi Zhou
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include "avcodec.h"
+#include "libavutil/bswap.h"
+
+static av_cold int decode_init(AVCodecContext *avctx)
+{
+ avctx->pix_fmt = PIX_FMT_RGB48;
+ 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;
+ }
+
+ pic->reference = 0;
+ if (avctx->get_buffer(avctx, pic) < 0)
+ return -1;
+
+ 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++);
+ *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"),
+};
Index: libavformat/isom.c
===================================================================
--- libavformat/isom.c (revision 23711)
+++ libavformat/isom.c (working copy)
@@ -77,6 +77,7 @@
{ CODEC_ID_RAWVIDEO, MKTAG('b', '1', '6', 'g') },
{ CODEC_ID_RAWVIDEO, MKTAG('b', '4', '8', 'r') },
+ { CODEC_ID_R10K, MKTAG('R', '1', '0', 'k') }, /* UNCOMPRESSED 10BIT RGB */
{ CODEC_ID_R210, MKTAG('r', '2', '1', '0') }, /* UNCOMPRESSED 10BIT RGB */
{ CODEC_ID_V210, MKTAG('v', '2', '1', '0') }, /* UNCOMPRESSED 10BIT 4:2:2 */
Index: libavformat/riff.c
===================================================================
--- libavformat/riff.c (revision 23711)
+++ libavformat/riff.c (working copy)
@@ -178,6 +178,7 @@
{ CODEC_ID_RAWVIDEO, MKTAG('Y', 'U', 'V', '9') },
{ CODEC_ID_RAWVIDEO, MKTAG('Y', 'V', 'U', '9') },
{ CODEC_ID_FRWU, MKTAG('F', 'R', 'W', 'U') },
+ { CODEC_ID_R10K, MKTAG('R', '1', '0', 'k') },
{ CODEC_ID_R210, MKTAG('r', '2', '1', '0') },
{ CODEC_ID_V210, MKTAG('v', '2', '1', '0') },
{ CODEC_ID_INDEO3, MKTAG('I', 'V', '3', '1') },
ZZ
More information about the ffmpeg-devel
mailing list