3 * Copyright (c) 2003 Michael Niedermayer
5 * This file is part of Libav.
7 * Libav 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.
12 * Libav 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.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with Libav; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
30 #include "libavutil/internal.h"
32 typedef struct VCR1Context
{
38 static av_cold
int vcr1_common_init(AVCodecContext
*avctx
)
40 VCR1Context
*const a
= avctx
->priv_data
;
42 avctx
->coded_frame
= &a
->picture
;
47 static av_cold
int vcr1_decode_init(AVCodecContext
*avctx
)
49 vcr1_common_init(avctx
);
51 avctx
->pix_fmt
= AV_PIX_FMT_YUV410P
;
56 static av_cold
int vcr1_decode_end(AVCodecContext
*avctx
)
58 VCR1Context
*s
= avctx
->priv_data
;
60 if (s
->picture
.data
[0])
61 avctx
->release_buffer(avctx
, &s
->picture
);
66 static int vcr1_decode_frame(AVCodecContext
*avctx
, void *data
,
67 int *got_frame
, AVPacket
*avpkt
)
69 const uint8_t *buf
= avpkt
->data
;
70 int buf_size
= avpkt
->size
;
71 VCR1Context
*const a
= avctx
->priv_data
;
72 AVFrame
*picture
= data
;
73 AVFrame
*const p
= &a
->picture
;
74 const uint8_t *bytestream
= buf
;
78 avctx
->release_buffer(avctx
, p
);
81 if ((ret
= ff_get_buffer(avctx
, p
)) < 0) {
82 av_log(avctx
, AV_LOG_ERROR
, "get_buffer() failed\n");
85 p
->pict_type
= AV_PICTURE_TYPE_I
;
88 for (i
= 0; i
< 16; i
++) {
89 a
->delta
[i
] = *bytestream
++;
93 for (y
= 0; y
< avctx
->height
; y
++) {
95 uint8_t *luma
= &a
->picture
.data
[0][y
* a
->picture
.linesize
[0]];
98 uint8_t *cb
= &a
->picture
.data
[1][(y
>> 2) * a
->picture
.linesize
[1]];
99 uint8_t *cr
= &a
->picture
.data
[2][(y
>> 2) * a
->picture
.linesize
[2]];
101 for (i
= 0; i
< 4; i
++)
102 a
->offset
[i
] = *bytestream
++;
104 offset
= a
->offset
[0] - a
->delta
[bytestream
[2] & 0xF];
105 for (x
= 0; x
< avctx
->width
; x
+= 4) {
106 luma
[0] = offset
+= a
->delta
[bytestream
[2] & 0xF];
107 luma
[1] = offset
+= a
->delta
[bytestream
[2] >> 4];
108 luma
[2] = offset
+= a
->delta
[bytestream
[0] & 0xF];
109 luma
[3] = offset
+= a
->delta
[bytestream
[0] >> 4];
112 *cb
++ = bytestream
[3];
113 *cr
++ = bytestream
[1];
118 offset
= a
->offset
[y
& 3] - a
->delta
[bytestream
[2] & 0xF];
120 for (x
= 0; x
< avctx
->width
; x
+= 8) {
121 luma
[0] = offset
+= a
->delta
[bytestream
[2] & 0xF];
122 luma
[1] = offset
+= a
->delta
[bytestream
[2] >> 4];
123 luma
[2] = offset
+= a
->delta
[bytestream
[3] & 0xF];
124 luma
[3] = offset
+= a
->delta
[bytestream
[3] >> 4];
125 luma
[4] = offset
+= a
->delta
[bytestream
[0] & 0xF];
126 luma
[5] = offset
+= a
->delta
[bytestream
[0] >> 4];
127 luma
[6] = offset
+= a
->delta
[bytestream
[1] & 0xF];
128 luma
[7] = offset
+= a
->delta
[bytestream
[1] >> 4];
135 *picture
= a
->picture
;
141 AVCodec ff_vcr1_decoder
= {
143 .type
= AVMEDIA_TYPE_VIDEO
,
144 .id
= AV_CODEC_ID_VCR1
,
145 .priv_data_size
= sizeof(VCR1Context
),
146 .init
= vcr1_decode_init
,
147 .close
= vcr1_decode_end
,
148 .decode
= vcr1_decode_frame
,
149 .capabilities
= CODEC_CAP_DR1
,
150 .long_name
= NULL_IF_CONFIG_SMALL("ATI VCR1"),