3 * Copyright (c) 2003 Michael Niedermayer
5 * This file is part of FFmpeg.
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.
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.
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
33 typedef struct VCR1Context
{
34 AVCodecContext
*avctx
;
40 static int decode_frame(AVCodecContext
*avctx
,
41 void *data
, int *data_size
,
42 const uint8_t *buf
, int buf_size
)
44 VCR1Context
* const a
= avctx
->priv_data
;
45 AVFrame
*picture
= data
;
46 AVFrame
* const p
= (AVFrame
*)&a
->picture
;
47 const uint8_t *bytestream
= buf
;
51 avctx
->release_buffer(avctx
, p
);
54 if(avctx
->get_buffer(avctx
, p
) < 0){
55 av_log(avctx
, AV_LOG_ERROR
, "get_buffer() failed\n");
58 p
->pict_type
= FF_I_TYPE
;
62 a
->delta
[i
]= *(bytestream
++);
66 for(y
=0; y
<avctx
->height
; y
++){
68 uint8_t *luma
= &a
->picture
.data
[0][ y
*a
->picture
.linesize
[0] ];
71 uint8_t *cb
= &a
->picture
.data
[1][ (y
>>2)*a
->picture
.linesize
[1] ];
72 uint8_t *cr
= &a
->picture
.data
[2][ (y
>>2)*a
->picture
.linesize
[2] ];
75 a
->offset
[i
]= *(bytestream
++);
77 offset
= a
->offset
[0] - a
->delta
[ bytestream
[2]&0xF ];
78 for(x
=0; x
<avctx
->width
; x
+=4){
79 luma
[0]=( offset
+= a
->delta
[ bytestream
[2]&0xF ]);
80 luma
[1]=( offset
+= a
->delta
[ bytestream
[2]>>4 ]);
81 luma
[2]=( offset
+= a
->delta
[ bytestream
[0]&0xF ]);
82 luma
[3]=( offset
+= a
->delta
[ bytestream
[0]>>4 ]);
85 *(cb
++) = bytestream
[3];
86 *(cr
++) = bytestream
[1];
91 offset
= a
->offset
[y
&3] - a
->delta
[ bytestream
[2]&0xF ];
93 for(x
=0; x
<avctx
->width
; x
+=8){
94 luma
[0]=( offset
+= a
->delta
[ bytestream
[2]&0xF ]);
95 luma
[1]=( offset
+= a
->delta
[ bytestream
[2]>>4 ]);
96 luma
[2]=( offset
+= a
->delta
[ bytestream
[3]&0xF ]);
97 luma
[3]=( offset
+= a
->delta
[ bytestream
[3]>>4 ]);
98 luma
[4]=( offset
+= a
->delta
[ bytestream
[0]&0xF ]);
99 luma
[5]=( offset
+= a
->delta
[ bytestream
[0]>>4 ]);
100 luma
[6]=( offset
+= a
->delta
[ bytestream
[1]&0xF ]);
101 luma
[7]=( offset
+= a
->delta
[ bytestream
[1]>>4 ]);
108 *picture
= *(AVFrame
*)&a
->picture
;
109 *data_size
= sizeof(AVPicture
);
117 static int encode_frame(AVCodecContext
*avctx
, unsigned char *buf
, int buf_size
, void *data
){
118 VCR1Context
* const a
= avctx
->priv_data
;
119 AVFrame
*pict
= data
;
120 AVFrame
* const p
= (AVFrame
*)&a
->picture
;
125 p
->pict_type
= FF_I_TYPE
;
130 align_put_bits(&a
->pb
);
131 while(get_bit_count(&a
->pb
)&31)
132 put_bits(&a
->pb
, 8, 0);
134 size
= get_bit_count(&a
->pb
)/32;
140 static av_cold
void common_init(AVCodecContext
*avctx
){
141 VCR1Context
* const a
= avctx
->priv_data
;
143 avctx
->coded_frame
= (AVFrame
*)&a
->picture
;
147 static av_cold
int decode_init(AVCodecContext
*avctx
){
151 avctx
->pix_fmt
= PIX_FMT_YUV410P
;
157 static av_cold
int encode_init(AVCodecContext
*avctx
){
165 AVCodec vcr1_decoder
= {
175 .long_name
= "ATI VCR1",
178 #ifdef CONFIG_ENCODERS
180 AVCodec vcr1_encoder
= {
188 .long_name
= "ATI VCR1",
191 #endif //CONFIG_ENCODERS