FFmpeg
Main Page
Related Pages
Modules
Data Structures
Files
Examples
File List
Globals
•
All
Data Structures
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
libavcodec
aura.c
Go to the documentation of this file.
1
/*
2
* Aura 2 decoder
3
*
4
* This file is part of FFmpeg.
5
*
6
* FFmpeg is free software; you can redistribute it and/or
7
* modify it under the terms of the GNU Lesser General Public
8
* License as published by the Free Software Foundation; either
9
* version 2.1 of the License, or (at your option) any later version.
10
*
11
* FFmpeg is distributed in the hope that it will be useful,
12
* but WITHOUT ANY WARRANTY; without even the implied warranty of
13
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14
* Lesser General Public License for more details.
15
*
16
* You should have received a copy of the GNU Lesser General Public
17
* License along with FFmpeg; if not, write to the Free Software
18
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19
*/
20
21
/**
22
* @file
23
* Aura 2 decoder
24
*/
25
26
#include "
avcodec.h
"
27
#include "
internal.h
"
28
#include "
libavutil/internal.h
"
29
30
typedef
struct
AuraDecodeContext
{
31
AVCodecContext
*
avctx
;
32
AVFrame
frame
;
33
}
AuraDecodeContext
;
34
35
static
av_cold
int
aura_decode_init
(
AVCodecContext
*avctx)
36
{
37
AuraDecodeContext
*s = avctx->
priv_data
;
38
39
s->
avctx
= avctx;
40
/* width needs to be divisible by 4 for this codec to work */
41
if
(avctx->
width
& 0x3)
42
return
AVERROR
(EINVAL);
43
avctx->
pix_fmt
=
AV_PIX_FMT_YUV422P
;
44
avcodec_get_frame_defaults
(&s->
frame
);
45
46
return
0;
47
}
48
49
static
int
aura_decode_frame
(
AVCodecContext
*avctx,
50
void
*
data
,
int
*got_frame,
51
AVPacket
*
pkt
)
52
{
53
AuraDecodeContext
*s = avctx->
priv_data
;
54
uint8_t
*
Y
, *
U
, *
V
;
55
uint8_t
val;
56
int
x,
y
, ret;
57
const
uint8_t
*buf = pkt->
data
;
58
59
/* prediction error tables (make it clear that they are signed values) */
60
const
int8_t *delta_table = (
const
int8_t*)buf + 16;
61
62
if
(pkt->
size
!= 48 + avctx->
height
* avctx->
width
) {
63
av_log
(avctx,
AV_LOG_ERROR
,
"got a buffer with %d bytes when %d were expected\n"
,
64
pkt->
size
, 48 + avctx->
height
* avctx->
width
);
65
return
AVERROR_INVALIDDATA
;
66
}
67
68
/* pixel data starts 48 bytes in, after 3x16-byte tables */
69
buf += 48;
70
71
if
(s->
frame
.
data
[0])
72
avctx->
release_buffer
(avctx, &s->
frame
);
73
74
s->
frame
.
buffer_hints
=
FF_BUFFER_HINTS_VALID
;
75
s->
frame
.
reference
= 0;
76
if
((ret =
ff_get_buffer
(avctx, &s->
frame
)) < 0) {
77
av_log
(avctx,
AV_LOG_ERROR
,
"get_buffer() failed\n"
);
78
return
ret;
79
}
80
81
Y = s->
frame
.
data
[0];
82
U = s->
frame
.
data
[1];
83
V = s->
frame
.
data
[2];
84
85
/* iterate through each line in the height */
86
for
(y = 0; y < avctx->
height
; y++) {
87
/* reset predictors */
88
val = *buf++;
89
U[0] = val & 0xF0;
90
Y[0] = val << 4;
91
val = *buf++;
92
V[0] = val & 0xF0;
93
Y[1] = Y[0] + delta_table[val & 0xF];
94
Y += 2; U++; V++;
95
96
/* iterate through the remaining pixel groups (4 pixels/group) */
97
for
(x = 1; x < (avctx->
width
>> 1); x++) {
98
val = *buf++;
99
U[0] = U[-1] + delta_table[val >> 4];
100
Y[0] = Y[-1] + delta_table[val & 0xF];
101
val = *buf++;
102
V[0] = V[-1] + delta_table[val >> 4];
103
Y[1] = Y[ 0] + delta_table[val & 0xF];
104
Y += 2; U++; V++;
105
}
106
Y += s->
frame
.
linesize
[0] - avctx->
width
;
107
U += s->
frame
.
linesize
[1] - (avctx->
width
>> 1);
108
V += s->
frame
.
linesize
[2] - (avctx->
width
>> 1);
109
}
110
111
*got_frame = 1;
112
*(
AVFrame
*)data = s->
frame
;
113
114
return
pkt->
size
;
115
}
116
117
static
av_cold
int
aura_decode_end
(
AVCodecContext
*avctx)
118
{
119
AuraDecodeContext
*s = avctx->
priv_data
;
120
121
if
(s->
frame
.
data
[0])
122
avctx->
release_buffer
(avctx, &s->
frame
);
123
124
return
0;
125
}
126
127
AVCodec
ff_aura2_decoder
= {
128
.
name
=
"aura2"
,
129
.type =
AVMEDIA_TYPE_VIDEO
,
130
.id =
AV_CODEC_ID_AURA2
,
131
.priv_data_size =
sizeof
(
AuraDecodeContext
),
132
.
init
=
aura_decode_init
,
133
.
close
=
aura_decode_end
,
134
.
decode
=
aura_decode_frame
,
135
.capabilities =
CODEC_CAP_DR1
,
136
.long_name =
NULL_IF_CONFIG_SMALL
(
"Auravision Aura 2"
),
137
};
Generated on Sat May 25 2013 04:01:01 for FFmpeg by
1.8.2