Coverage Report

Created: 2026-09-14 08:00

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/ffmpeg/libavcodec/rawenc.c
Line
Count
Source
1
/*
2
 * Raw Video Encoder
3
 * Copyright (c) 2001 Fabrice Bellard
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
/**
23
 * @file
24
 * Raw Video Encoder
25
 */
26
27
#include "avcodec.h"
28
#include "codec_internal.h"
29
#include "encode.h"
30
#include "raw.h"
31
#include "internal.h"
32
#include "libavutil/pixdesc.h"
33
#include "libavutil/intreadwrite.h"
34
#include "libavutil/imgutils.h"
35
#include "libavutil/internal.h"
36
37
static av_cold int raw_encode_init(AVCodecContext *avctx)
38
192
{
39
192
    const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(avctx->pix_fmt);
40
41
192
    avctx->bits_per_coded_sample = av_get_bits_per_pixel(desc);
42
192
    if(!avctx->codec_tag)
43
192
        avctx->codec_tag = avcodec_pix_fmt_to_codec_tag(avctx->pix_fmt);
44
192
    avctx->bit_rate = ff_guess_coded_bitrate(avctx);
45
46
192
    return 0;
47
192
}
48
49
static int raw_encode(AVCodecContext *avctx, AVPacket *pkt,
50
                      const AVFrame *frame, int *got_packet)
51
6.28k
{
52
6.28k
    int ret = av_image_get_buffer_size(frame->format,
53
6.28k
                                       frame->width, frame->height, 1);
54
55
6.28k
    if (ret < 0)
56
0
        return ret;
57
58
6.28k
    if ((ret = ff_get_encode_buffer(avctx, pkt, ret, 0)) < 0)
59
0
        return ret;
60
6.28k
    if ((ret = av_image_copy_to_buffer(pkt->data, pkt->size,
61
6.28k
                                       (const uint8_t **)frame->data, frame->linesize,
62
6.28k
                                       frame->format,
63
6.28k
                                       frame->width, frame->height, 1)) < 0)
64
0
        return ret;
65
66
6.28k
    if(avctx->codec_tag == AV_RL32("yuv2") && ret > 0 &&
67
0
       frame->format   == AV_PIX_FMT_YUYV422) {
68
0
        int x;
69
0
        for(x = 1; x < frame->height*frame->width*2; x += 2)
70
0
            pkt->data[x] ^= 0x80;
71
6.28k
    } else if (avctx->codec_tag == AV_RL32("b64a") && ret > 0 &&
72
0
        frame->format == AV_PIX_FMT_RGBA64BE) {
73
0
        uint64_t v;
74
0
        int x;
75
0
        for (x = 0; x < frame->height * frame->width; x++) {
76
0
            v = AV_RB64(&pkt->data[8 * x]);
77
0
            AV_WB64(&pkt->data[8 * x], v << 48 | v >> 16);
78
0
        }
79
0
    }
80
6.28k
    *got_packet = 1;
81
6.28k
    return 0;
82
6.28k
}
83
84
const FFCodec ff_rawvideo_encoder = {
85
    .p.name         = "rawvideo",
86
    CODEC_LONG_NAME("raw video"),
87
    .p.type         = AVMEDIA_TYPE_VIDEO,
88
    .p.id           = AV_CODEC_ID_RAWVIDEO,
89
    .p.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_FRAME_THREADS |
90
                      AV_CODEC_CAP_ENCODER_REORDERED_OPAQUE,
91
    .init           = raw_encode_init,
92
    FF_CODEC_ENCODE_CB(raw_encode),
93
};