FFmpeg
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
Examples
File List
Globals
•
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
libavcodec
wnv1.c
Go to the documentation of this file.
1
/*
2
* Winnov WNV1 codec
3
* Copyright (c) 2005 Konstantin Shishkov
4
*
5
* This file is part of FFmpeg.
6
*
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.
11
*
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.
16
*
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
20
*/
21
22
/**
23
* @file
24
* Winnov WNV1 codec.
25
*/
26
27
#include "
avcodec.h
"
28
#include "
get_bits.h
"
29
#include "
internal.h
"
30
#include "
mathops.h
"
31
32
33
typedef
struct
WNV1Context
{
34
int
shift
;
35
GetBitContext
gb
;
36
}
WNV1Context
;
37
38
static
const
uint16_t
code_tab
[16][2] = {
39
{ 0x1FD, 9 }, { 0xFD, 8 }, { 0x7D, 7 }, { 0x3D, 6 }, { 0x1D, 5 }, { 0x0D, 4 }, { 0x005, 3 },
40
{ 0x000, 1 },
41
{ 0x004, 3 }, { 0x0C, 4 }, { 0x1C, 5 }, { 0x3C, 6 }, { 0x7C, 7 }, { 0xFC, 8 }, { 0x1FC, 9 }, { 0xFF, 8 }
42
};
43
44
#define CODE_VLC_BITS 9
45
static
VLC
code_vlc
;
46
47
/* returns modified base_value */
48
static
inline
int
wnv1_get_code
(
WNV1Context
*w,
int
base_value)
49
{
50
int
v
=
get_vlc2
(&w->
gb
, code_vlc.
table
,
CODE_VLC_BITS
, 1);
51
52
if
(v == 15)
53
return
ff_reverse
[
get_bits
(&w->
gb
, 8 - w->
shift
)];
54
else
55
return
base_value + ((v - 7) << w->
shift
);
56
}
57
58
static
int
decode_frame
(
AVCodecContext
*avctx,
59
void
*
data
,
int
*got_frame,
60
AVPacket
*avpkt)
61
{
62
WNV1Context
*
const
l = avctx->
priv_data
;
63
const
uint8_t
*
buf
= avpkt->
data
;
64
int
buf_size = avpkt->
size
;
65
AVFrame
*
const
p =
data
;
66
unsigned
char
*
Y
,*
U
,*
V
;
67
int
i, j,
ret
;
68
int
prev_y = 0, prev_u = 0, prev_v = 0;
69
uint8_t
*rbuf;
70
71
if
(buf_size <= 8) {
72
av_log
(avctx,
AV_LOG_ERROR
,
"Packet size %d is too small\n"
, buf_size);
73
return
AVERROR_INVALIDDATA
;
74
}
75
76
rbuf =
av_malloc
(buf_size +
FF_INPUT_BUFFER_PADDING_SIZE
);
77
if
(!rbuf) {
78
av_log
(avctx,
AV_LOG_ERROR
,
"Cannot allocate temporary buffer\n"
);
79
return
AVERROR
(ENOMEM);
80
}
81
82
if
((ret =
ff_get_buffer
(avctx, p, 0)) < 0) {
83
av_free
(rbuf);
84
return
ret
;
85
}
86
p->
key_frame
= 1;
87
88
for
(i = 8; i < buf_size; i++)
89
rbuf[i] =
ff_reverse
[buf[i]];
90
init_get_bits
(&l->
gb
, rbuf + 8, (buf_size - 8) * 8);
91
92
if
(buf[2] >> 4 == 6)
93
l->
shift
= 2;
94
else
{
95
l->
shift
= 8 - (buf[2] >> 4);
96
if
(l->
shift
> 4) {
97
avpriv_request_sample
(avctx,
98
"Unknown WNV1 frame header value %i"
,
99
buf[2] >> 4);
100
l->
shift
= 4;
101
}
102
if
(l->
shift
< 1) {
103
avpriv_request_sample
(avctx,
104
"Unknown WNV1 frame header value %i"
,
105
buf[2] >> 4);
106
l->
shift
= 1;
107
}
108
}
109
110
Y = p->
data
[0];
111
U = p->
data
[1];
112
V = p->
data
[2];
113
for
(j = 0; j < avctx->
height
; j++) {
114
for
(i = 0; i < avctx->
width
/ 2; i++) {
115
Y[i * 2] =
wnv1_get_code
(l, prev_y);
116
prev_u = U[i] =
wnv1_get_code
(l, prev_u);
117
prev_y = Y[(i * 2) + 1] =
wnv1_get_code
(l, Y[i * 2]);
118
prev_v = V[i] =
wnv1_get_code
(l, prev_v);
119
}
120
Y += p->
linesize
[0];
121
U += p->
linesize
[1];
122
V += p->
linesize
[2];
123
}
124
125
126
*got_frame = 1;
127
av_free
(rbuf);
128
129
return
buf_size;
130
}
131
132
static
av_cold
int
decode_init
(
AVCodecContext
*avctx)
133
{
134
static
VLC_TYPE
code_table[1 <<
CODE_VLC_BITS
][2];
135
136
avctx->
pix_fmt
=
AV_PIX_FMT_YUV422P
;
137
138
code_vlc.
table
= code_table;
139
code_vlc.
table_allocated
= 1 <<
CODE_VLC_BITS
;
140
init_vlc
(&code_vlc,
CODE_VLC_BITS
, 16,
141
&
code_tab
[0][1], 4, 2,
142
&
code_tab
[0][0], 4, 2,
INIT_VLC_USE_NEW_STATIC
);
143
144
return
0;
145
}
146
147
AVCodec
ff_wnv1_decoder
= {
148
.
name
=
"wnv1"
,
149
.long_name =
NULL_IF_CONFIG_SMALL
(
"Winnov WNV1"
),
150
.type =
AVMEDIA_TYPE_VIDEO
,
151
.id =
AV_CODEC_ID_WNV1
,
152
.priv_data_size =
sizeof
(
WNV1Context
),
153
.
init
=
decode_init
,
154
.
decode
=
decode_frame
,
155
.capabilities =
CODEC_CAP_DR1
,
156
};
Generated on Sat Jan 25 2014 19:51:58 for FFmpeg by
1.8.2