Main Page
Related Pages
Modules
Data Structures
Files
Examples
File List
Globals
libavcodec
cljr.c
Go to the documentation of this file.
1
/*
2
* Cirrus Logic AccuPak (CLJR) codec
3
* Copyright (c) 2003 Alex Beregszaszi
4
*
5
* This file is part of Libav.
6
*
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.
11
*
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.
16
*
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
20
*/
21
27
#include "
avcodec.h
"
28
#include "
get_bits.h
"
29
#include "
put_bits.h
"
30
31
typedef
struct
CLJRContext
{
32
AVFrame
picture
;
33
}
CLJRContext
;
34
35
static
av_cold
int
common_init
(
AVCodecContext
*avctx)
36
{
37
CLJRContext
*
const
a = avctx->
priv_data
;
38
39
avctx->
coded_frame
= &a->
picture
;
40
41
return
0;
42
}
43
44
#if CONFIG_CLJR_DECODER
45
static
int
decode_frame
(
AVCodecContext
*avctx,
46
void
*
data
,
int
*data_size,
47
AVPacket
*avpkt)
48
{
49
const
uint8_t *buf = avpkt->
data
;
50
int
buf_size = avpkt->
size
;
51
CLJRContext
*
const
a = avctx->
priv_data
;
52
GetBitContext
gb;
53
AVFrame
*
picture
=
data
;
54
AVFrame
*
const
p = &a->
picture
;
55
int
x, y;
56
57
if
(p->
data
[0])
58
avctx->
release_buffer
(avctx, p);
59
60
if
(avctx->
height
<= 0 || avctx->
width
<= 0) {
61
av_log
(avctx,
AV_LOG_ERROR
,
"Invalid width or height\n"
);
62
return
AVERROR_INVALIDDATA
;
63
}
64
65
if
(buf_size < avctx->
height
* avctx->
width
) {
66
av_log
(avctx,
AV_LOG_ERROR
,
67
"Resolution larger than buffer size. Invalid header?\n"
);
68
return
AVERROR_INVALIDDATA
;
69
}
70
71
p->
reference
= 0;
72
if
(avctx->
get_buffer
(avctx, p) < 0) {
73
av_log
(avctx,
AV_LOG_ERROR
,
"get_buffer() failed\n"
);
74
return
-1;
75
}
76
p->
pict_type
=
AV_PICTURE_TYPE_I
;
77
p->
key_frame
= 1;
78
79
init_get_bits
(&gb, buf, buf_size * 8);
80
81
for
(y = 0; y < avctx->
height
; y++) {
82
uint8_t *luma = &a->
picture
.
data
[0][y * a->
picture
.
linesize
[0]];
83
uint8_t *cb = &a->
picture
.
data
[1][y * a->
picture
.
linesize
[1]];
84
uint8_t *cr = &a->
picture
.
data
[2][y * a->
picture
.
linesize
[2]];
85
for
(x = 0; x < avctx->
width
; x += 4) {
86
luma[3] =
get_bits
(&gb, 5) << 3;
87
luma[2] =
get_bits
(&gb, 5) << 3;
88
luma[1] =
get_bits
(&gb, 5) << 3;
89
luma[0] =
get_bits
(&gb, 5) << 3;
90
luma += 4;
91
*(cb++) =
get_bits
(&gb, 6) << 2;
92
*(cr++) =
get_bits
(&gb, 6) << 2;
93
}
94
}
95
96
*picture = a->
picture
;
97
*data_size =
sizeof
(
AVPicture
);
98
99
return
buf_size;
100
}
101
102
static
av_cold
int
decode_init
(
AVCodecContext
*avctx)
103
{
104
avctx->
pix_fmt
=
PIX_FMT_YUV411P
;
105
return
common_init
(avctx);
106
}
107
108
static
av_cold
int
decode_end
(
AVCodecContext
*avctx)
109
{
110
CLJRContext
*a = avctx->
priv_data
;
111
112
if
(a->
picture
.
data
[0])
113
avctx->
release_buffer
(avctx, &a->
picture
);
114
return
0;
115
}
116
117
AVCodec
ff_cljr_decoder = {
118
.
name
=
"cljr"
,
119
.type =
AVMEDIA_TYPE_VIDEO
,
120
.id =
CODEC_ID_CLJR
,
121
.priv_data_size =
sizeof
(
CLJRContext
),
122
.
init
=
decode_init
,
123
.
close
=
decode_end
,
124
.
decode
=
decode_frame
,
125
.capabilities =
CODEC_CAP_DR1
,
126
.long_name =
NULL_IF_CONFIG_SMALL
(
"Cirrus Logic AccuPak"
),
127
};
128
#endif
129
130
#if CONFIG_CLJR_ENCODER
131
static
int
encode_frame
(
AVCodecContext
*avctx,
unsigned
char
*buf,
132
int
buf_size,
void
*data)
133
{
134
PutBitContext
pb;
135
AVFrame
*p =
data
;
136
int
x, y;
137
138
p->
pict_type
=
AV_PICTURE_TYPE_I
;
139
p->
key_frame
= 1;
140
141
init_put_bits
(&pb, buf, buf_size / 8);
142
143
for
(y = 0; y < avctx->
height
; y++) {
144
uint8_t *luma = &p->
data
[0][y * p->
linesize
[0]];
145
uint8_t *cb = &p->
data
[1][y * p->
linesize
[1]];
146
uint8_t *cr = &p->
data
[2][y * p->
linesize
[2]];
147
for
(x = 0; x < avctx->
width
; x += 4) {
148
put_bits
(&pb, 5, luma[3] >> 3);
149
put_bits
(&pb, 5, luma[2] >> 3);
150
put_bits
(&pb, 5, luma[1] >> 3);
151
put_bits
(&pb, 5, luma[0] >> 3);
152
luma += 4;
153
put_bits
(&pb, 6, *(cb++) >> 2);
154
put_bits
(&pb, 6, *(cr++) >> 2);
155
}
156
}
157
158
flush_put_bits
(&pb);
159
160
return
put_bits_count
(&pb) / 8;
161
}
162
163
AVCodec
ff_cljr_encoder = {
164
.
name
=
"cljr"
,
165
.type =
AVMEDIA_TYPE_VIDEO
,
166
.id =
CODEC_ID_CLJR
,
167
.priv_data_size =
sizeof
(
CLJRContext
),
168
.
init
=
common_init
,
169
.encode =
encode_frame
,
170
.pix_fmts = (
const
enum
PixelFormat
[]) {
PIX_FMT_YUV411P
,
171
PIX_FMT_NONE
},
172
.long_name =
NULL_IF_CONFIG_SMALL
(
"Cirrus Logic AccuPak"
),
173
};
174
#endif