Browse code

r210, r10k and avrp encoder

Signed-off-by: Paul B Mahol <onemda@gmail.com>
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>

Paul B Mahol authored on 2012/01/26 04:46:57
Showing 6 changed files
... ...
@@ -18,7 +18,7 @@ version next:
18 18
 - Automatic thread count based on detection number of (available) CPU cores
19 19
 - y41p Brooktree Uncompressed 4:1:1 12-bit encoder and decoder
20 20
 - ffprobe -show_error option
21
-- Avid 1:1 10-bit RGB Packer decoder
21
+- Avid 1:1 10-bit RGB Packer codec
22 22
 - v308 Quicktime Uncompressed 4:4:4 encoder and decoder
23 23
 - yuv4 libquicktime packed 4:2:0 encoder and decoder
24 24
 - ffprobe -show_frames option
... ...
@@ -28,6 +28,7 @@ version next:
28 28
 - optimized iMDCT transform on x86 using SSE for for mpegaudiodec
29 29
 - Improved PGS subtitle decoder
30 30
 - dumpgraph option to lavfi device
31
+- r210 and r10k encoders
31 32
 
32 33
 
33 34
 version 0.9:
... ...
@@ -440,7 +440,7 @@ following image formats are supported:
440 440
 @item Autodesk Animator Flic video  @tab     @tab  X
441 441
 @item Autodesk RLE           @tab     @tab  X
442 442
     @tab fourcc: AASC
443
-@item Avid 1:1 10-bit RGB Packer  @tab   @tab  X
443
+@item Avid 1:1 10-bit RGB Packer  @tab  X  @tab  X
444 444
     @tab fourcc: AVrp
445 445
 @item AVS (Audio Video Standard) video  @tab     @tab  X
446 446
     @tab Video encoding used by the Creature Shock game.
... ...
@@ -577,8 +577,8 @@ following image formats are supported:
577 577
     @tab fourcc: 'smc '
578 578
 @item QuickTime video (RPZA) @tab     @tab  X
579 579
     @tab fourcc: rpza
580
-@item R10K AJA Kona 10-bit RGB Codec     @tab     @tab  X
581
-@item R210 Quicktime Uncompressed RGB 10-bit     @tab     @tab  X
580
+@item R10K AJA Kona 10-bit RGB Codec     @tab  X  @tab  X
581
+@item R210 Quicktime Uncompressed RGB 10-bit     @tab  X  @tab  X
582 582
 @item Raw Video              @tab  X  @tab  X
583 583
 @item RealVideo 1.0          @tab  X  @tab  X
584 584
 @item RealVideo 2.0          @tab  X  @tab  X
... ...
@@ -92,6 +92,7 @@ OBJS-$(CONFIG_ATRAC3_DECODER)          += atrac3.o atrac.o
92 92
 OBJS-$(CONFIG_AURA_DECODER)            += cyuv.o
93 93
 OBJS-$(CONFIG_AURA2_DECODER)           += aura.o
94 94
 OBJS-$(CONFIG_AVRP_DECODER)            += r210dec.o
95
+OBJS-$(CONFIG_AVRP_ENCODER)            += r210enc.o
95 96
 OBJS-$(CONFIG_AVS_DECODER)             += avs.o
96 97
 OBJS-$(CONFIG_BETHSOFTVID_DECODER)     += bethsoftvideo.o
97 98
 OBJS-$(CONFIG_BFI_DECODER)             += bfi.o
... ...
@@ -339,7 +340,9 @@ OBJS-$(CONFIG_QPEG_DECODER)            += qpeg.o
339 339
 OBJS-$(CONFIG_QTRLE_DECODER)           += qtrle.o
340 340
 OBJS-$(CONFIG_QTRLE_ENCODER)           += qtrleenc.o
341 341
 OBJS-$(CONFIG_R10K_DECODER)            += r210dec.o
342
+OBJS-$(CONFIG_R10K_ENCODER)            += r210enc.o
342 343
 OBJS-$(CONFIG_R210_DECODER)            += r210dec.o
344
+OBJS-$(CONFIG_R210_ENCODER)            += r210enc.o
343 345
 OBJS-$(CONFIG_RA_144_DECODER)          += ra144dec.o ra144.o celp_filters.o
344 346
 OBJS-$(CONFIG_RA_144_ENCODER)          += ra144enc.o ra144.o celp_filters.o
345 347
 OBJS-$(CONFIG_RA_288_DECODER)          += ra288.o celp_math.o celp_filters.o
... ...
@@ -79,7 +79,7 @@ void avcodec_register_all(void)
79 79
     REGISTER_ENCDEC  (ASV2, asv2);
80 80
     REGISTER_DECODER (AURA, aura);
81 81
     REGISTER_DECODER (AURA2, aura2);
82
-    REGISTER_DECODER (AVRP, avrp);
82
+    REGISTER_ENCDEC  (AVRP, avrp);
83 83
     REGISTER_DECODER (AVS, avs);
84 84
     REGISTER_DECODER (BETHSOFTVID, bethsoftvid);
85 85
     REGISTER_DECODER (BFI, bfi);
... ...
@@ -184,8 +184,8 @@ void avcodec_register_all(void)
184 184
     REGISTER_DECODER (QDRAW, qdraw);
185 185
     REGISTER_DECODER (QPEG, qpeg);
186 186
     REGISTER_ENCDEC  (QTRLE, qtrle);
187
-    REGISTER_DECODER (R10K,  r10k);
188
-    REGISTER_DECODER (R210,  r210);
187
+    REGISTER_ENCDEC  (R10K,  r10k);
188
+    REGISTER_ENCDEC  (R210,  r210);
189 189
     REGISTER_ENCDEC  (RAWVIDEO, rawvideo);
190 190
     REGISTER_DECODER (RL2, rl2);
191 191
     REGISTER_ENCDEC  (ROQ, roq);
192 192
new file mode 100644
... ...
@@ -0,0 +1,120 @@
0
+/*
1
+ * R210 encoder
2
+ *
3
+ * Copyright (c) 2012 Paul B Mahol
4
+ *
5
+ * This file is part of FFmpeg.
6
+ *
7
+ * FFmpeg is free software; you can redistribute it and/or
8
+ * modify it under the terms of the GNU Lesser General Public
9
+ * License as published by the Free Software Foundation; either
10
+ * version 2.1 of the License, or (at your option) any later version.
11
+ *
12
+ * FFmpeg is distributed in the hope that it will be useful,
13
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
14
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15
+ * Lesser General Public License for more details.
16
+ *
17
+ * You should have received a copy of the GNU Lesser General Public
18
+ * License along with FFmpeg; if not, write to the Free Software
19
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20
+ */
21
+
22
+#include "avcodec.h"
23
+#include "bytestream.h"
24
+
25
+static av_cold int encode_init(AVCodecContext *avctx)
26
+{
27
+    avctx->coded_frame = avcodec_alloc_frame();
28
+
29
+    if (!avctx->coded_frame)
30
+        return AVERROR(ENOMEM);
31
+
32
+    return 0;
33
+}
34
+
35
+static int encode_frame(AVCodecContext *avctx, uint8_t *buf,
36
+                        int buf_size, void *data)
37
+{
38
+    AVFrame *pic = data;
39
+    int i, j;
40
+    int aligned_width = FFALIGN(avctx->width, 64);
41
+    uint8_t *src_line;
42
+    uint8_t *dst = buf;
43
+
44
+    if (buf_size < 4 * aligned_width * avctx->height) {
45
+        av_log(avctx, AV_LOG_ERROR, "output buffer too small\n");
46
+        return AVERROR(ENOMEM);
47
+    }
48
+
49
+    avctx->coded_frame->reference = 0;
50
+    avctx->coded_frame->key_frame = 1;
51
+    avctx->coded_frame->pict_type = AV_PICTURE_TYPE_I;
52
+    src_line = pic->data[0];
53
+
54
+    for (i = 0; i < avctx->height; i++) {
55
+        uint16_t *src = (uint16_t *)src_line;
56
+        for (j = 0; j < avctx->width; j++) {
57
+            uint32_t pixel;
58
+            uint16_t r = *src++ >> 6;
59
+            uint16_t g = *src++ >> 6;
60
+            uint16_t b = *src++ >> 4;
61
+            if (avctx->codec_id == CODEC_ID_R210)
62
+                pixel = (r << 20) | (g << 10) | b >> 2;
63
+            else
64
+                pixel = (r << 22) | (g << 12) | b;
65
+            if (avctx->codec_id == CODEC_ID_AVRP)
66
+                bytestream_put_le32(&dst, pixel);
67
+            else
68
+                bytestream_put_be32(&dst, pixel);
69
+        }
70
+        dst += aligned_width - avctx->width;
71
+        src_line += pic->linesize[0];
72
+    }
73
+
74
+    return 4 * aligned_width * avctx->height;
75
+}
76
+
77
+static av_cold int encode_close(AVCodecContext *avctx)
78
+{
79
+    av_freep(&avctx->coded_frame);
80
+
81
+    return 0;
82
+}
83
+
84
+#if CONFIG_R210_ENCODER
85
+AVCodec ff_r210_encoder = {
86
+    .name           = "r210",
87
+    .type           = AVMEDIA_TYPE_VIDEO,
88
+    .id             = CODEC_ID_R210,
89
+    .init           = encode_init,
90
+    .encode         = encode_frame,
91
+    .close          = encode_close,
92
+    .pix_fmts       = (const enum PixelFormat[]) { PIX_FMT_RGB48, PIX_FMT_NONE },
93
+    .long_name      = NULL_IF_CONFIG_SMALL("Uncompressed RGB 10-bit"),
94
+};
95
+#endif
96
+#if CONFIG_R10K_ENCODER
97
+AVCodec ff_r10k_encoder = {
98
+    .name           = "r10k",
99
+    .type           = AVMEDIA_TYPE_VIDEO,
100
+    .id             = CODEC_ID_R10K,
101
+    .init           = encode_init,
102
+    .encode         = encode_frame,
103
+    .close          = encode_close,
104
+    .pix_fmts       = (const enum PixelFormat[]) { PIX_FMT_RGB48, PIX_FMT_NONE },
105
+    .long_name      = NULL_IF_CONFIG_SMALL("AJA Kona 10-bit RGB Codec"),
106
+};
107
+#endif
108
+#if CONFIG_AVRP_ENCODER
109
+AVCodec ff_avrp_encoder = {
110
+    .name           = "avrp",
111
+    .type           = AVMEDIA_TYPE_VIDEO,
112
+    .id             = CODEC_ID_AVRP,
113
+    .init           = encode_init,
114
+    .encode         = encode_frame,
115
+    .close          = encode_close,
116
+    .pix_fmts       = (const enum PixelFormat[]) { PIX_FMT_RGB48, PIX_FMT_NONE },
117
+    .long_name      = NULL_IF_CONFIG_SMALL("Avid 1:1 10-bit RGB Packer"),
118
+};
119
+#endif
... ...
@@ -21,7 +21,7 @@
21 21
 #define AVCODEC_VERSION_H
22 22
 
23 23
 #define LIBAVCODEC_VERSION_MAJOR 53
24
-#define LIBAVCODEC_VERSION_MINOR 59
24
+#define LIBAVCODEC_VERSION_MINOR 60
25 25
 #define LIBAVCODEC_VERSION_MICRO 100
26 26
 
27 27
 #define LIBAVCODEC_VERSION_INT  AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \