2 * libquicktime yuv4 decoder
4 * Copyright (c) 2011 Carl Eugen Hoyos
6 * This file is part of FFmpeg.
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.
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.
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
26 static av_cold
int yuv4_decode_init(AVCodecContext
*avctx
)
28 avctx
->pix_fmt
= AV_PIX_FMT_YUV420P
;
33 static int yuv4_decode_frame(AVCodecContext
*avctx
, void *data
,
34 int *got_frame
, AVPacket
*avpkt
)
37 const uint8_t *src
= avpkt
->data
;
41 if (avpkt
->size
< 6 * (avctx
->width
+ 1 >> 1) * (avctx
->height
+ 1 >> 1)) {
42 av_log(avctx
, AV_LOG_ERROR
, "Insufficient input data.\n");
43 return AVERROR(EINVAL
);
46 if ((ret
= ff_get_buffer(avctx
, pic
, 0)) < 0)
50 pic
->pict_type
= AV_PICTURE_TYPE_I
;
56 for (i
= 0; i
< (avctx
->height
+ 1) >> 1; i
++) {
57 for (j
= 0; j
< (avctx
->width
+ 1) >> 1; j
++) {
61 y
[ 2 * j
+ 1] = *src
++;
62 y
[pic
->linesize
[0] + 2 * j
] = *src
++;
63 y
[pic
->linesize
[0] + 2 * j
+ 1] = *src
++;
66 y
+= 2 * pic
->linesize
[0];
67 u
+= pic
->linesize
[1];
68 v
+= pic
->linesize
[2];
76 AVCodec ff_yuv4_decoder
= {
78 .long_name
= NULL_IF_CONFIG_SMALL("Uncompressed packed 4:2:0"),
79 .type
= AVMEDIA_TYPE_VIDEO
,
80 .id
= AV_CODEC_ID_YUV4
,
81 .init
= yuv4_decode_init
,
82 .decode
= yuv4_decode_frame
,
83 .capabilities
= CODEC_CAP_DR1
,