/src/ffmpeg/libavcodec/r210enc.c
Line | Count | Source (jump to first uncovered line) |
1 | | /* |
2 | | * R210 encoder |
3 | | * |
4 | | * Copyright (c) 2012 Paul B Mahol |
5 | | * |
6 | | * This file is part of FFmpeg. |
7 | | * |
8 | | * FFmpeg is free software; you can redistribute it and/or |
9 | | * modify it under the terms of the GNU Lesser General Public |
10 | | * License as published by the Free Software Foundation; either |
11 | | * version 2.1 of the License, or (at your option) any later version. |
12 | | * |
13 | | * FFmpeg is distributed in the hope that it will be useful, |
14 | | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
15 | | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
16 | | * Lesser General Public License for more details. |
17 | | * |
18 | | * You should have received a copy of the GNU Lesser General Public |
19 | | * License along with FFmpeg; if not, write to the Free Software |
20 | | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
21 | | */ |
22 | | |
23 | | #include "config_components.h" |
24 | | |
25 | | #include "avcodec.h" |
26 | | #include "codec_internal.h" |
27 | | #include "encode.h" |
28 | | #include "internal.h" |
29 | | #include "bytestream.h" |
30 | | |
31 | | static av_cold int encode_init(AVCodecContext *avctx) |
32 | 703 | { |
33 | 703 | int aligned_width = FFALIGN(avctx->width, |
34 | 703 | avctx->codec_id == AV_CODEC_ID_R10K ? 1 : 64); |
35 | | |
36 | 703 | avctx->bits_per_coded_sample = 32; |
37 | 703 | if (avctx->width > 0) |
38 | 703 | avctx->bit_rate = av_rescale(ff_guess_coded_bitrate(avctx), aligned_width, avctx->width); |
39 | | |
40 | 703 | return 0; |
41 | 703 | } |
42 | | |
43 | | static int encode_frame(AVCodecContext *avctx, AVPacket *pkt, |
44 | | const AVFrame *pic, int *got_packet) |
45 | 9.11k | { |
46 | 9.11k | int i, j, ret; |
47 | 9.11k | int aligned_width = FFALIGN(avctx->width, |
48 | 9.11k | avctx->codec_id == AV_CODEC_ID_R10K ? 1 : 64); |
49 | 9.11k | int pad = (aligned_width - avctx->width) * 4; |
50 | 9.11k | const uint8_t *srcr_line, *srcg_line, *srcb_line; |
51 | 9.11k | uint8_t *dst; |
52 | | |
53 | 9.11k | ret = ff_get_encode_buffer(avctx, pkt, 4 * aligned_width * avctx->height, 0); |
54 | 9.11k | if (ret < 0) |
55 | 0 | return ret; |
56 | | |
57 | 9.11k | srcg_line = pic->data[0]; |
58 | 9.11k | srcb_line = pic->data[1]; |
59 | 9.11k | srcr_line = pic->data[2]; |
60 | 9.11k | dst = pkt->data; |
61 | | |
62 | 4.84M | for (i = 0; i < avctx->height; i++) { |
63 | 4.83M | const uint16_t *srcr = (const uint16_t *)srcr_line; |
64 | 4.83M | const uint16_t *srcg = (const uint16_t *)srcg_line; |
65 | 4.83M | const uint16_t *srcb = (const uint16_t *)srcb_line; |
66 | 40.3M | for (j = 0; j < avctx->width; j++) { |
67 | 35.5M | uint32_t pixel; |
68 | 35.5M | unsigned r = *srcr++; |
69 | 35.5M | unsigned g = *srcg++; |
70 | 35.5M | unsigned b = *srcb++; |
71 | 35.5M | if (avctx->codec_id == AV_CODEC_ID_R210) |
72 | 10.5M | pixel = (r << 20) | (g << 10) | b; |
73 | 24.9M | else |
74 | 24.9M | pixel = (r << 22) | (g << 12) | (b << 2); |
75 | 35.5M | if (avctx->codec_id == AV_CODEC_ID_AVRP) |
76 | 11.5M | bytestream_put_le32(&dst, pixel); |
77 | 24.0M | else |
78 | 24.0M | bytestream_put_be32(&dst, pixel); |
79 | 35.5M | } |
80 | 4.83M | memset(dst, 0, pad); |
81 | 4.83M | dst += pad; |
82 | 4.83M | srcr_line += pic->linesize[2]; |
83 | 4.83M | srcg_line += pic->linesize[0]; |
84 | 4.83M | srcb_line += pic->linesize[1]; |
85 | 4.83M | } |
86 | | |
87 | 9.11k | *got_packet = 1; |
88 | 9.11k | return 0; |
89 | 9.11k | } |
90 | | |
91 | | static const enum AVPixelFormat pix_fmt[] = { AV_PIX_FMT_GBRP10, AV_PIX_FMT_NONE }; |
92 | | |
93 | | #if CONFIG_R210_ENCODER |
94 | | const FFCodec ff_r210_encoder = { |
95 | | .p.name = "r210", |
96 | | CODEC_LONG_NAME("Uncompressed RGB 10-bit"), |
97 | | .p.type = AVMEDIA_TYPE_VIDEO, |
98 | | .p.id = AV_CODEC_ID_R210, |
99 | | .p.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_ENCODER_REORDERED_OPAQUE, |
100 | | .init = encode_init, |
101 | | FF_CODEC_ENCODE_CB(encode_frame), |
102 | | CODEC_PIXFMTS_ARRAY(pix_fmt), |
103 | | }; |
104 | | #endif |
105 | | #if CONFIG_R10K_ENCODER |
106 | | const FFCodec ff_r10k_encoder = { |
107 | | .p.name = "r10k", |
108 | | CODEC_LONG_NAME("AJA Kona 10-bit RGB Codec"), |
109 | | .p.type = AVMEDIA_TYPE_VIDEO, |
110 | | .p.id = AV_CODEC_ID_R10K, |
111 | | .p.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_ENCODER_REORDERED_OPAQUE, |
112 | | .init = encode_init, |
113 | | FF_CODEC_ENCODE_CB(encode_frame), |
114 | | CODEC_PIXFMTS_ARRAY(pix_fmt), |
115 | | }; |
116 | | #endif |
117 | | #if CONFIG_AVRP_ENCODER |
118 | | const FFCodec ff_avrp_encoder = { |
119 | | .p.name = "avrp", |
120 | | CODEC_LONG_NAME("Avid 1:1 10-bit RGB Packer"), |
121 | | .p.type = AVMEDIA_TYPE_VIDEO, |
122 | | .p.id = AV_CODEC_ID_AVRP, |
123 | | .p.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_ENCODER_REORDERED_OPAQUE, |
124 | | .init = encode_init, |
125 | | FF_CODEC_ENCODE_CB(encode_frame), |
126 | | CODEC_PIXFMTS_ARRAY(pix_fmt), |
127 | | }; |
128 | | #endif |