Coverage Report

Created: 2025-08-28 07:12

/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