[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