Main Page
Related Pages
Modules
Data Structures
Files
Examples
File List
Globals
libavcodec
v410dec.c
Go to the documentation of this file.
1
/*
2
* v410 decoder
3
*
4
* Copyright (c) 2011 Derek Buitenhuis
5
*
6
* This file is part of Libav.
7
*
8
* Libav is free software; you can redistribute it and/or
9
* modify it under the terms of the GNU Lesser General Public
10
* License as published by the Free Software Foundation; either
11
* version 2.1 of the License, or (at your option) any later version.
12
*
13
* Libav is distributed in the hope that it will be useful,
14
* but WITHOUT ANY WARRANTY; without even the implied warranty of
15
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16
* Lesser General Public License for more details.
17
*
18
* You should have received a copy of the GNU Lesser General Public
19
* License along with Libav; if not, write to the Free Software
20
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21
*/
22
23
#include "
libavutil/intreadwrite.h
"
24
#include "
avcodec.h
"
25
26
static
av_cold
int
v410_decode_init
(
AVCodecContext
*avctx)
27
{
28
avctx->
pix_fmt
=
PIX_FMT_YUV444P10
;
29
avctx->
bits_per_raw_sample
= 10;
30
31
if
(avctx->
width
& 1) {
32
av_log
(avctx,
AV_LOG_ERROR
,
"v410 requires even width.\n"
);
33
return
AVERROR_INVALIDDATA
;
34
}
35
36
avctx->
coded_frame
=
avcodec_alloc_frame
();
37
38
if
(!avctx->
coded_frame
) {
39
av_log
(avctx,
AV_LOG_ERROR
,
"Could not allocate frame.\n"
);
40
return
AVERROR
(ENOMEM);
41
}
42
43
return
0;
44
}
45
46
static
int
v410_decode_frame
(
AVCodecContext
*avctx,
void
*
data
,
47
int
*data_size,
AVPacket
*avpkt)
48
{
49
AVFrame
*pic = avctx->
coded_frame
;
50
uint8_t *src = avpkt->
data
;
51
uint16_t *y, *u, *
v
;
52
uint32_t val;
53
int
i, j;
54
55
if
(pic->
data
[0])
56
avctx->
release_buffer
(avctx, pic);
57
58
if
(avpkt->
size
< 4 * avctx->
height
* avctx->
width
) {
59
av_log
(avctx,
AV_LOG_ERROR
,
"Insufficient input data.\n"
);
60
return
AVERROR
(EINVAL);
61
}
62
63
pic->
reference
= 0;
64
65
if
(avctx->
get_buffer
(avctx, pic) < 0) {
66
av_log
(avctx,
AV_LOG_ERROR
,
"Could not allocate buffer.\n"
);
67
return
AVERROR
(ENOMEM);
68
}
69
70
pic->
key_frame
= 1;
71
pic->
pict_type
=
AV_PICTURE_TYPE_I
;
72
73
y = (uint16_t *)pic->
data
[0];
74
u = (uint16_t *)pic->
data
[1];
75
v = (uint16_t *)pic->
data
[2];
76
77
for
(i = 0; i < avctx->
height
; i++) {
78
for
(j = 0; j < avctx->
width
; j++) {
79
val =
AV_RL32
(src);
80
81
u[j] = (val >> 2) & 0x3FF;
82
y[j] = (val >> 12) & 0x3FF;
83
v[j] = (val >> 22);
84
85
src += 4;
86
}
87
88
y += pic->
linesize
[0] >> 1;
89
u += pic->
linesize
[1] >> 1;
90
v += pic->
linesize
[2] >> 1;
91
}
92
93
*data_size =
sizeof
(
AVFrame
);
94
*(
AVFrame
*)data = *pic;
95
96
return
avpkt->
size
;
97
}
98
99
static
av_cold
int
v410_decode_close
(
AVCodecContext
*avctx)
100
{
101
if
(avctx->
coded_frame
->
data
[0])
102
avctx->
release_buffer
(avctx, avctx->
coded_frame
);
103
104
av_freep
(&avctx->
coded_frame
);
105
106
return
0;
107
}
108
109
AVCodec
ff_v410_decoder
= {
110
.
name
=
"v410"
,
111
.type =
AVMEDIA_TYPE_VIDEO
,
112
.id =
CODEC_ID_V410
,
113
.init =
v410_decode_init
,
114
.decode =
v410_decode_frame
,
115
.close =
v410_decode_close
,
116
.capabilities =
CODEC_CAP_DR1
,
117
.long_name =
NULL_IF_CONFIG_SMALL
(
"Uncompressed 4:4:4 10-bit"
),
118
};