Coverage Report

Created: 2026-09-14 08:00

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/ffmpeg/libavcodec/rawdec.c
Line
Count
Source
1
/*
2
 * Raw Video Decoder
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 Decoder
25
 */
26
27
#include "avcodec.h"
28
#include "bswapdsp.h"
29
#include "codec_internal.h"
30
#include "decode.h"
31
#include "get_bits.h"
32
#include "raw.h"
33
#include "libavutil/avassert.h"
34
#include "libavutil/buffer.h"
35
#include "libavutil/intreadwrite.h"
36
#include "libavutil/imgutils.h"
37
#include "libavutil/mem.h"
38
#include "libavutil/opt.h"
39
40
typedef struct RawVideoContext {
41
    AVClass *av_class;
42
    AVBufferRef *palette;
43
    int frame_size;  /* size of the frame in bytes */
44
    int flip;
45
    int is_1_2_4_8_bpp; // 1, 2, 4 and 8 bpp in avi/mov, 1 and 8 bpp in nut
46
    int is_mono;
47
    int is_pal8;
48
    int is_nut_mono;
49
    int is_nut_pal8;
50
    int is_yuv2;
51
    int is_lt_16bpp; // 16bpp pixfmt and bits_per_coded_sample < 16
52
    int tff;
53
54
    BswapDSPContext bbdsp;
55
    void *bitstream_buf;
56
    unsigned int bitstream_buf_size;
57
} RawVideoContext;
58
59
static const AVOption options[]={
60
{"top", "top field first", offsetof(RawVideoContext, tff), AV_OPT_TYPE_BOOL, {.i64 = -1}, -1, 1, AV_OPT_FLAG_DECODING_PARAM|AV_OPT_FLAG_VIDEO_PARAM},
61
{NULL}
62
};
63
64
static const AVClass rawdec_class = {
65
    .class_name = "rawdec",
66
    .option     = options,
67
    .version    = LIBAVUTIL_VERSION_INT,
68
};
69
70
static av_cold int raw_init_decoder(AVCodecContext *avctx)
71
1.20k
{
72
1.20k
    RawVideoContext *context = avctx->priv_data;
73
1.20k
    const AVPixFmtDescriptor *desc;
74
75
1.20k
    ff_bswapdsp_init(&context->bbdsp);
76
77
1.20k
    if (   avctx->codec_tag == MKTAG('r','a','w',' ')
78
1.17k
        || avctx->codec_tag == MKTAG('N','O','1','6'))
79
33
        avctx->pix_fmt = avpriv_pix_fmt_find(PIX_FMT_LIST_MOV,
80
33
                                      avctx->bits_per_coded_sample);
81
1.17k
    else if (avctx->codec_tag == MKTAG('W', 'R', 'A', 'W'))
82
2
        avctx->pix_fmt = avpriv_pix_fmt_find(PIX_FMT_LIST_AVI,
83
2
                                      avctx->bits_per_coded_sample);
84
1.16k
    else if (avctx->codec_tag && (avctx->codec_tag & 0xFFFFFF) != MKTAG('B','I','T', 0))
85
729
        avctx->pix_fmt = avpriv_pix_fmt_find(PIX_FMT_LIST_RAW, avctx->codec_tag);
86
439
    else if (avctx->pix_fmt == AV_PIX_FMT_NONE && avctx->bits_per_coded_sample)
87
419
        avctx->pix_fmt = avpriv_pix_fmt_find(PIX_FMT_LIST_AVI,
88
419
                                      avctx->bits_per_coded_sample);
89
90
1.20k
    desc = av_pix_fmt_desc_get(avctx->pix_fmt);
91
1.20k
    if (!desc) {
92
238
        av_log(avctx, AV_LOG_ERROR, "Invalid pixel format.\n");
93
238
        return AVERROR(EINVAL);
94
238
    }
95
96
965
    if (desc->flags & AV_PIX_FMT_FLAG_PAL) {
97
479
        context->palette = av_buffer_alloc(AVPALETTE_SIZE);
98
479
        if (!context->palette)
99
0
            return AVERROR(ENOMEM);
100
479
        memset(context->palette->data, 0, AVPALETTE_SIZE);
101
479
        if (avctx->bits_per_coded_sample == 1)
102
111
            memset(context->palette->data, 0xff, 4);
103
479
    }
104
105
965
    if ((avctx->extradata_size >= 9 &&
106
130
         !memcmp(avctx->extradata + avctx->extradata_size - 9, "BottomUp", 9)) ||
107
962
        avctx->codec_tag == MKTAG('c','y','u','v') ||
108
961
        avctx->codec_tag == MKTAG(3, 0, 0, 0) ||
109
918
        avctx->codec_tag == MKTAG('W','R','A','W'))
110
49
        context->flip = 1;
111
112
965
    if (avctx->pix_fmt == AV_PIX_FMT_MONOWHITE ||
113
944
        avctx->pix_fmt == AV_PIX_FMT_MONOBLACK)
114
32
        context->is_mono = 1;
115
933
    else if (avctx->pix_fmt == AV_PIX_FMT_PAL8)
116
479
        context->is_pal8 = 1;
117
118
965
    if (avctx->codec_tag == MKTAG('B','1','W','0') ||
119
944
        avctx->codec_tag == MKTAG('B','0','W','1'))
120
32
        context->is_nut_mono = 1;
121
933
    else if (avctx->codec_tag == MKTAG('P','A','L',8))
122
145
        context->is_nut_pal8 = 1;
123
124
965
    if (avctx->codec_tag == AV_RL32("yuv2") &&
125
43
        avctx->pix_fmt   == AV_PIX_FMT_YUYV422)
126
43
        context->is_yuv2 = 1;
127
128
965
    return 0;
129
965
}
130
131
static void flip(AVCodecContext *avctx, AVFrame *frame)
132
2.36k
{
133
2.36k
    frame->data[0]     += frame->linesize[0] * (avctx->height - 1);
134
2.36k
    frame->linesize[0] *= -1;
135
2.36k
}
136
137
/*
138
 * Scale sample to 16-bit resolution
139
 */
140
#define SCALE16(x, bits) (((x) << (16 - (bits))) | ((x) >> (2 * (bits) - 16)))
141
142
/**
143
 * Scale buffer to 16 bits per coded sample resolution
144
 */
145
#define MKSCALE16(name, r16, w16) \
146
4.11k
static void name(AVCodecContext *avctx, uint8_t * dst, const uint8_t *buf, int buf_size, int packed) \
147
4.11k
{ \
148
4.11k
    int i; \
149
4.11k
    if (!packed) { \
150
987k
        for (i = 0; i + 1 < buf_size; i += 2) \
151
4.11k
            w16(dst + i, SCALE16(r16(buf + i), avctx->bits_per_coded_sample)); \
152
4.11k
    } else { \
153
0
        GetBitContext gb; \
154
0
        init_get_bits(&gb, buf, buf_size * 8); \
155
0
        for (i = 0; i < avctx->width * avctx->height; i++) { \
156
0
            int sample = get_bits(&gb, avctx->bits_per_coded_sample); \
157
0
            w16(dst + i*2, SCALE16(sample, avctx->bits_per_coded_sample)); \
158
0
        } \
159
0
   } \
160
4.11k
}
rawdec.c:scale16be
Line
Count
Source
146
2.49k
static void name(AVCodecContext *avctx, uint8_t * dst, const uint8_t *buf, int buf_size, int packed) \
147
2.49k
{ \
148
2.49k
    int i; \
149
2.49k
    if (!packed) { \
150
748k
        for (i = 0; i + 1 < buf_size; i += 2) \
151
2.49k
            w16(dst + i, SCALE16(r16(buf + i), avctx->bits_per_coded_sample)); \
152
2.49k
    } else { \
153
0
        GetBitContext gb; \
154
0
        init_get_bits(&gb, buf, buf_size * 8); \
155
0
        for (i = 0; i < avctx->width * avctx->height; i++) { \
156
0
            int sample = get_bits(&gb, avctx->bits_per_coded_sample); \
157
0
            w16(dst + i*2, SCALE16(sample, avctx->bits_per_coded_sample)); \
158
0
        } \
159
0
   } \
160
2.49k
}
rawdec.c:scale16le
Line
Count
Source
146
1.62k
static void name(AVCodecContext *avctx, uint8_t * dst, const uint8_t *buf, int buf_size, int packed) \
147
1.62k
{ \
148
1.62k
    int i; \
149
1.62k
    if (!packed) { \
150
238k
        for (i = 0; i + 1 < buf_size; i += 2) \
151
1.62k
            w16(dst + i, SCALE16(r16(buf + i), avctx->bits_per_coded_sample)); \
152
1.62k
    } else { \
153
0
        GetBitContext gb; \
154
0
        init_get_bits(&gb, buf, buf_size * 8); \
155
0
        for (i = 0; i < avctx->width * avctx->height; i++) { \
156
0
            int sample = get_bits(&gb, avctx->bits_per_coded_sample); \
157
0
            w16(dst + i*2, SCALE16(sample, avctx->bits_per_coded_sample)); \
158
0
        } \
159
0
   } \
160
1.62k
}
161
162
2.49k
MKSCALE16(scale16be, AV_RB16, AV_WB16)
163
1.62k
MKSCALE16(scale16le, AV_RL16, AV_WL16)
164
165
static int raw_decode(AVCodecContext *avctx, AVFrame *frame,
166
                      int *got_frame, AVPacket *avpkt)
167
228k
{
168
228k
    const AVPixFmtDescriptor *desc;
169
228k
    RawVideoContext *context       = avctx->priv_data;
170
228k
    const uint8_t *buf             = avpkt->data;
171
228k
    int buf_size                   = avpkt->size;
172
228k
    int linesize_align             = 4;
173
228k
    int stride;
174
228k
    int res, len;
175
228k
    int need_copy;
176
177
228k
    if (avctx->width <= 0) {
178
5.24k
        av_log(avctx, AV_LOG_ERROR, "width is not set\n");
179
5.24k
        return AVERROR_INVALIDDATA;
180
5.24k
    }
181
223k
    if (avctx->height <= 0) {
182
0
        av_log(avctx, AV_LOG_ERROR, "height is not set\n");
183
0
        return AVERROR_INVALIDDATA;
184
0
    }
185
186
223k
    if (context->is_nut_mono)
187
10.1k
        stride = avctx->width / 8 + (avctx->width & 7 ? 1 : 0);
188
213k
    else if (context->is_nut_pal8)
189
1.82k
        stride = avctx->width;
190
211k
    else
191
211k
        stride = avpkt->size / avctx->height;
192
193
223k
    av_log(avctx, AV_LOG_DEBUG, "PACKET SIZE: %d, STRIDE: %d\n", avpkt->size, stride);
194
195
223k
    if (stride == 0 || avpkt->size < stride * avctx->height) {
196
75.2k
        av_log(avctx, AV_LOG_ERROR, "Packet too small (%d)\n", avpkt->size);
197
75.2k
        return AVERROR_INVALIDDATA;
198
75.2k
    }
199
200
148k
    desc = av_pix_fmt_desc_get(avctx->pix_fmt);
201
202
148k
    if ((avctx->bits_per_coded_sample == 8 || avctx->bits_per_coded_sample == 4 ||
203
140k
         avctx->bits_per_coded_sample == 2 || avctx->bits_per_coded_sample == 1 ||
204
25.4k
         (avctx->bits_per_coded_sample == 0 && (context->is_nut_pal8 || context->is_mono)) ) &&
205
131k
        (context->is_mono || context->is_pal8) &&
206
130k
        (!avctx->codec_tag || avctx->codec_tag == MKTAG('r','a','w',' ') ||
207
129k
                context->is_nut_mono || context->is_nut_pal8)) {
208
129k
        context->is_1_2_4_8_bpp = 1;
209
129k
        if (context->is_mono) {
210
8.68k
            int row_bytes = avctx->width / 8 + (avctx->width & 7 ? 1 : 0);
211
8.68k
            context->frame_size = av_image_get_buffer_size(avctx->pix_fmt,
212
8.68k
                                                           FFALIGN(row_bytes, 16) * 8,
213
8.68k
                                                           avctx->height, 1);
214
8.68k
        } else
215
120k
            context->frame_size = av_image_get_buffer_size(avctx->pix_fmt,
216
120k
                                                           FFALIGN(avctx->width, 16),
217
120k
                                                           avctx->height, 1);
218
129k
    } else {
219
18.5k
        context->is_lt_16bpp = av_get_bits_per_pixel(desc) == 16 && avctx->bits_per_coded_sample > 8 && avctx->bits_per_coded_sample < 16;
220
18.5k
        context->frame_size = av_image_get_buffer_size(avctx->pix_fmt, avctx->width,
221
18.5k
                                                       avctx->height, 1);
222
18.5k
    }
223
148k
    if (context->frame_size < 0)
224
241
        return context->frame_size;
225
226
147k
    need_copy = !avpkt->buf || context->is_1_2_4_8_bpp || context->is_yuv2 || context->is_lt_16bpp;
227
228
147k
    res = ff_decode_frame_props(avctx, frame);
229
147k
    if (res < 0)
230
0
        return res;
231
232
147k
    if (context->tff >= 0) {
233
0
        frame->flags |= AV_FRAME_FLAG_INTERLACED;
234
0
        if (context->tff == 1)
235
0
            frame->flags |= AV_FRAME_FLAG_TOP_FIELD_FIRST;
236
0
    }
237
238
147k
    if ((res = av_image_check_size(avctx->width, avctx->height, 0, avctx)) < 0)
239
0
        return res;
240
241
147k
    if (need_copy)
242
134k
        frame->buf[0] = av_buffer_alloc(FFMAX(context->frame_size, buf_size));
243
12.9k
    else
244
12.9k
        frame->buf[0] = av_buffer_ref(avpkt->buf);
245
147k
    if (!frame->buf[0])
246
0
        return AVERROR(ENOMEM);
247
248
    // 1, 2, 4 and 8 bpp in avi/mov, 1 and 8 bpp in nut
249
147k
    if (context->is_1_2_4_8_bpp) {
250
129k
        int i, j, row_pix = 0;
251
129k
        uint8_t *dst = frame->buf[0]->data;
252
129k
        buf_size = context->frame_size - (context->is_pal8 ? AVPALETTE_SIZE : 0);
253
129k
        if (avctx->bits_per_coded_sample == 8 || context->is_nut_pal8 || context->is_mono) {
254
13.2k
            int pix_per_byte = context->is_mono ? 8 : 1;
255
1.17M
            for (i = 0, j = 0; j < buf_size && i<avpkt->size; i++, j++) {
256
1.16M
                dst[j] = buf[i];
257
1.16M
                row_pix += pix_per_byte;
258
1.16M
                if (row_pix >= avctx->width) {
259
10.3k
                    i += stride - (i % stride) - 1;
260
10.3k
                    j += 16 - (j % 16) - 1;
261
10.3k
                    row_pix = 0;
262
10.3k
                }
263
1.16M
            }
264
116k
        } else if (avctx->bits_per_coded_sample == 4) {
265
1.36M
            for (i = 0, j = 0; 2 * j + 1 < buf_size && i<avpkt->size; i++, j++) {
266
1.36M
                dst[2 * j + 0] = buf[i] >> 4;
267
1.36M
                dst[2 * j + 1] = buf[i] & 15;
268
1.36M
                row_pix += 2;
269
1.36M
                if (row_pix >= avctx->width) {
270
1.85k
                    i += stride - (i % stride) - 1;
271
1.85k
                    j += 8 - (j % 8) - 1;
272
1.85k
                    row_pix = 0;
273
1.85k
                }
274
1.36M
            }
275
113k
        } else if (avctx->bits_per_coded_sample == 2) {
276
873k
            for (i = 0, j = 0; 4 * j + 3 < buf_size && i<avpkt->size; i++, j++) {
277
768k
                dst[4 * j + 0] = buf[i] >> 6;
278
768k
                dst[4 * j + 1] = buf[i] >> 4 & 3;
279
768k
                dst[4 * j + 2] = buf[i] >> 2 & 3;
280
768k
                dst[4 * j + 3] = buf[i]      & 3;
281
768k
                row_pix += 4;
282
768k
                if (row_pix >= avctx->width) {
283
2.83k
                    i += stride - (i % stride) - 1;
284
2.83k
                    j += 4 - (j % 4) - 1;
285
2.83k
                    row_pix = 0;
286
2.83k
                }
287
768k
            }
288
105k
        } else {
289
7.33k
            av_assert0(avctx->bits_per_coded_sample == 1);
290
1.10M
            for (i = 0, j = 0; 8 * j + 7 < buf_size && i<avpkt->size; i++, j++) {
291
1.09M
                dst[8 * j + 0] = buf[i] >> 7;
292
1.09M
                dst[8 * j + 1] = buf[i] >> 6 & 1;
293
1.09M
                dst[8 * j + 2] = buf[i] >> 5 & 1;
294
1.09M
                dst[8 * j + 3] = buf[i] >> 4 & 1;
295
1.09M
                dst[8 * j + 4] = buf[i] >> 3 & 1;
296
1.09M
                dst[8 * j + 5] = buf[i] >> 2 & 1;
297
1.09M
                dst[8 * j + 6] = buf[i] >> 1 & 1;
298
1.09M
                dst[8 * j + 7] = buf[i]      & 1;
299
1.09M
                row_pix += 8;
300
1.09M
                if (row_pix >= avctx->width) {
301
799
                    i += stride - (i % stride) - 1;
302
799
                    j += 2 - (j % 2) - 1;
303
799
                    row_pix = 0;
304
799
                }
305
1.09M
            }
306
7.33k
        }
307
129k
        linesize_align = 16;
308
129k
        buf = dst;
309
129k
    } else if (context->is_lt_16bpp) {
310
4.11k
        uint8_t *dst = frame->buf[0]->data;
311
4.11k
        int packed = (avctx->codec_tag & 0xFFFFFF) == MKTAG('B','I','T', 0);
312
4.11k
        int swap   =  avctx->codec_tag >> 24;
313
314
4.11k
        if (packed && swap) {
315
0
            av_fast_padded_malloc(&context->bitstream_buf, &context->bitstream_buf_size, buf_size);
316
0
            if (!context->bitstream_buf)
317
0
                return AVERROR(ENOMEM);
318
0
            if (swap == 16)
319
0
                context->bbdsp.bswap16_buf(context->bitstream_buf, (const uint16_t*)buf, buf_size / 2);
320
0
            else if (swap == 32)
321
0
                context->bbdsp.bswap_buf(context->bitstream_buf, (const uint32_t*)buf, buf_size / 4);
322
0
            else
323
0
                return AVERROR_INVALIDDATA;
324
0
            buf = context->bitstream_buf;
325
0
        }
326
327
4.11k
        if (desc->flags & AV_PIX_FMT_FLAG_BE)
328
2.49k
            scale16be(avctx, dst, buf, buf_size, packed);
329
1.62k
        else
330
1.62k
            scale16le(avctx, dst, buf, buf_size, packed);
331
332
4.11k
        buf = dst;
333
14.4k
    } else if (need_copy) {
334
1.46k
        memcpy(frame->buf[0]->data, buf, buf_size);
335
1.46k
        buf = frame->buf[0]->data;
336
1.46k
    }
337
338
147k
    if (avctx->codec_tag == MKTAG('A', 'V', '1', 'x') ||
339
147k
        avctx->codec_tag == MKTAG('A', 'V', 'u', 'p'))
340
664
        buf += buf_size - context->frame_size;
341
342
147k
    len = context->frame_size - (avctx->pix_fmt==AV_PIX_FMT_PAL8 ? AVPALETTE_SIZE : 0);
343
147k
    if (buf_size < len && ((avctx->codec_tag & 0xFFFFFF) != MKTAG('B','I','T', 0) || !need_copy)) {
344
12.6k
        av_log(avctx, AV_LOG_ERROR, "Invalid buffer size, packet size %d < expected frame_size %d\n", buf_size, len);
345
12.6k
        av_buffer_unref(&frame->buf[0]);
346
12.6k
        return AVERROR(EINVAL);
347
12.6k
    }
348
349
135k
    if ((res = av_image_fill_arrays(frame->data, frame->linesize,
350
135k
                                    buf, avctx->pix_fmt,
351
135k
                                    avctx->width, avctx->height, 1)) < 0) {
352
0
        av_buffer_unref(&frame->buf[0]);
353
0
        return res;
354
0
    }
355
356
135k
    if (avctx->pix_fmt == AV_PIX_FMT_PAL8) {
357
121k
        int ret;
358
359
121k
        if (!context->palette)
360
0
            context->palette = av_buffer_alloc(AVPALETTE_SIZE);
361
121k
        if (!context->palette) {
362
0
            av_buffer_unref(&frame->buf[0]);
363
0
            return AVERROR(ENOMEM);
364
0
        }
365
121k
        ret = av_buffer_make_writable(&context->palette);
366
121k
        if (ret < 0) {
367
0
            av_buffer_unref(&frame->buf[0]);
368
0
            return ret;
369
0
        }
370
371
121k
        if (!ff_copy_palette(context->palette->data, avpkt, avctx) && context->is_nut_pal8) {
372
1.12k
            int vid_size = avctx->width * avctx->height;
373
1.12k
            int pal_size = avpkt->size - vid_size;
374
375
1.12k
            if (avpkt->size > vid_size && pal_size <= AVPALETTE_SIZE) {
376
393
                const uint8_t *pal = avpkt->data + vid_size;
377
393
                memcpy(context->palette->data, pal, pal_size);
378
393
            }
379
1.12k
        }
380
121k
    }
381
382
135k
    if ((avctx->pix_fmt==AV_PIX_FMT_RGB24    ||
383
135k
        avctx->pix_fmt==AV_PIX_FMT_BGR24     ||
384
134k
        avctx->pix_fmt==AV_PIX_FMT_GRAY8     ||
385
134k
        avctx->pix_fmt==AV_PIX_FMT_RGB555LE  ||
386
133k
        avctx->pix_fmt==AV_PIX_FMT_RGB555BE  ||
387
133k
        avctx->pix_fmt==AV_PIX_FMT_RGB565LE  ||
388
133k
        avctx->pix_fmt==AV_PIX_FMT_MONOWHITE ||
389
124k
        avctx->pix_fmt==AV_PIX_FMT_MONOBLACK ||
390
124k
        avctx->pix_fmt==AV_PIX_FMT_PAL8) &&
391
132k
        FFALIGN(frame->linesize[0], linesize_align) * avctx->height <= buf_size)
392
130k
        frame->linesize[0] = FFALIGN(frame->linesize[0], linesize_align);
393
394
135k
    if (avctx->pix_fmt == AV_PIX_FMT_NV12 && avctx->codec_tag == MKTAG('N', 'V', '1', '2') &&
395
440
        FFALIGN(frame->linesize[0], linesize_align) * avctx->height +
396
440
        FFALIGN(frame->linesize[1], linesize_align) * ((avctx->height + 1) / 2) <= buf_size) {
397
210
        int la0 = FFALIGN(frame->linesize[0], linesize_align);
398
210
        frame->data[1] += (la0 - frame->linesize[0]) * avctx->height;
399
210
        frame->linesize[0] = la0;
400
210
        frame->linesize[1] = FFALIGN(frame->linesize[1], linesize_align);
401
210
    }
402
403
135k
    if (avctx->pix_fmt == AV_PIX_FMT_PAL8 && buf_size < context->frame_size) {
404
121k
        frame->buf[1]  = av_buffer_ref(context->palette);
405
121k
        if (!frame->buf[1]) {
406
0
            av_buffer_unref(&frame->buf[0]);
407
0
            return AVERROR(ENOMEM);
408
0
        }
409
121k
        frame->data[1] = frame->buf[1]->data;
410
121k
    }
411
412
135k
    if (avctx->pix_fmt == AV_PIX_FMT_BGR24 &&
413
877
        ((frame->linesize[0] + 3) & ~3) * avctx->height <= buf_size)
414
399
        frame->linesize[0] = (frame->linesize[0] + 3) & ~3;
415
416
135k
    if (context->flip)
417
2.36k
        flip(avctx, frame);
418
419
135k
    if (avctx->codec_tag == MKTAG('Y', 'V', '1', '2') ||
420
135k
        avctx->codec_tag == MKTAG('Y', 'V', '1', '6') ||
421
134k
        avctx->codec_tag == MKTAG('Y', 'V', '2', '4') ||
422
134k
        avctx->codec_tag == MKTAG('Y', 'V', 'U', '9'))
423
1.01k
        FFSWAP(uint8_t *, frame->data[1], frame->data[2]);
424
425
135k
    if (avctx->codec_tag == AV_RL32("I420") && (avctx->width+1)*(avctx->height+1) * 3/2 == buf_size) {
426
195
        frame->data[1] = frame->data[1] +  (avctx->width+1)*(avctx->height+1) -avctx->width*avctx->height;
427
195
        frame->data[2] = frame->data[2] + ((avctx->width+1)*(avctx->height+1) -avctx->width*avctx->height)*5/4;
428
195
    }
429
430
135k
    if (avctx->codec_tag == AV_RL32("yuv2") &&
431
325
        avctx->pix_fmt   == AV_PIX_FMT_YUYV422) {
432
325
        int x, y;
433
325
        uint8_t *line = frame->data[0];
434
5.89k
        for (y = 0; y < avctx->height; y++) {
435
186k
            for (x = 0; x < avctx->width; x++)
436
181k
                line[2 * x + 1] ^= 0x80;
437
5.56k
            line += frame->linesize[0];
438
5.56k
        }
439
325
    }
440
441
135k
    if (avctx->codec_tag == AV_RL32("b64a") &&
442
210
        avctx->pix_fmt   == AV_PIX_FMT_RGBA64BE) {
443
210
        uint8_t *dst = frame->data[0];
444
210
        uint64_t v;
445
210
        int x, y;
446
709
        for (y = 0; y < avctx->height; y++) {
447
1.27k
            for (x = 0; x >> 3 < avctx->width; x += 8) {
448
780
                v = AV_RB64(&dst[x]);
449
780
                AV_WB64(&dst[x], v << 16 | v >> 48);
450
780
            }
451
499
            dst += frame->linesize[0];
452
499
        }
453
210
    }
454
455
135k
    if (avctx->field_order > AV_FIELD_PROGRESSIVE) { /* we have interlaced material flagged in container */
456
0
        frame->flags |= AV_FRAME_FLAG_INTERLACED;
457
0
        if (avctx->field_order == AV_FIELD_TT || avctx->field_order == AV_FIELD_TB)
458
0
            frame->flags |= AV_FRAME_FLAG_TOP_FIELD_FIRST;
459
0
    }
460
461
135k
    *got_frame = 1;
462
135k
    return buf_size;
463
135k
}
464
465
static av_cold int raw_close_decoder(AVCodecContext *avctx)
466
965
{
467
965
    RawVideoContext *context = avctx->priv_data;
468
469
965
    av_buffer_unref(&context->palette);
470
965
    av_freep(&context->bitstream_buf);
471
965
    return 0;
472
965
}
473
474
const FFCodec ff_rawvideo_decoder = {
475
    .p.name         = "rawvideo",
476
    CODEC_LONG_NAME("raw video"),
477
    .p.type         = AVMEDIA_TYPE_VIDEO,
478
    .p.id           = AV_CODEC_ID_RAWVIDEO,
479
    .priv_data_size = sizeof(RawVideoContext),
480
    .init           = raw_init_decoder,
481
    .close          = raw_close_decoder,
482
    FF_CODEC_DECODE_CB(raw_decode),
483
    .p.priv_class   = &rawdec_class,
484
    .p.capabilities = AV_CODEC_CAP_PARAM_CHANGE,
485
};