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
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 FFmpeg.
7
*
8
* FFmpeg 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
* FFmpeg 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 FFmpeg; 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/common.h
"
24
#include "
libavutil/intreadwrite.h
"
25
#include "
avcodec.h
"
26
#include "
internal.h
"
27
28
static
av_cold
int
v410_decode_init
(
AVCodecContext
*avctx)
29
{
30
avctx->
pix_fmt
=
AV_PIX_FMT_YUV444P10
;
31
avctx->
bits_per_raw_sample
= 10;
32
33
if
(avctx->
width
& 1) {
34
if
(avctx->
err_recognition
&
AV_EF_EXPLODE
) {
35
av_log
(avctx,
AV_LOG_ERROR
,
"v410 requires width to be even.\n"
);
36
return
AVERROR_INVALIDDATA
;
37
}
else
{
38
av_log
(avctx,
AV_LOG_WARNING
,
"v410 requires width to be even, continuing anyway.\n"
);
39
}
40
}
41
42
avctx->
coded_frame
=
avcodec_alloc_frame
();
43
44
if
(!avctx->
coded_frame
) {
45
av_log
(avctx,
AV_LOG_ERROR
,
"Could not allocate frame.\n"
);
46
return
AVERROR
(ENOMEM);
47
}
48
49
return
0;
50
}
51
52
static
int
v410_decode_frame
(
AVCodecContext
*avctx,
void
*
data
,
53
int
*got_frame,
AVPacket
*avpkt)
54
{
55
AVFrame
*pic = avctx->
coded_frame
;
56
uint8_t
*src = avpkt->
data
;
57
uint16_t *y, *u, *v;
58
uint32_t val;
59
int
i, j;
60
61
if
(pic->
data
[0])
62
avctx->
release_buffer
(avctx, pic);
63
64
if
(avpkt->
size
< 4 * avctx->
height
* avctx->
width
) {
65
av_log
(avctx,
AV_LOG_ERROR
,
"Insufficient input data.\n"
);
66
return
AVERROR
(EINVAL);
67
}
68
69
pic->
reference
= 0;
70
71
if
(
ff_get_buffer
(avctx, pic) < 0) {
72
av_log
(avctx,
AV_LOG_ERROR
,
"Could not allocate buffer.\n"
);
73
return
AVERROR
(ENOMEM);
74
}
75
76
pic->
key_frame
= 1;
77
pic->
pict_type
=
AV_PICTURE_TYPE_I
;
78
79
y = (uint16_t *)pic->
data
[0];
80
u = (uint16_t *)pic->
data
[1];
81
v = (uint16_t *)pic->
data
[2];
82
83
for
(i = 0; i < avctx->
height
; i++) {
84
for
(j = 0; j < avctx->
width
; j++) {
85
val =
AV_RL32
(src);
86
87
u[j] = (val >> 2) & 0x3FF;
88
y[j] = (val >> 12) & 0x3FF;
89
v[j] = (val >> 22);
90
91
src += 4;
92
}
93
94
y += pic->
linesize
[0] >> 1;
95
u += pic->
linesize
[1] >> 1;
96
v += pic->
linesize
[2] >> 1;
97
}
98
99
*got_frame = 1;
100
*(
AVFrame
*)data = *pic;
101
102
return
avpkt->
size
;
103
}
104
105
static
av_cold
int
v410_decode_close
(
AVCodecContext
*avctx)
106
{
107
if
(avctx->
coded_frame
->
data
[0])
108
avctx->
release_buffer
(avctx, avctx->
coded_frame
);
109
110
av_freep
(&avctx->
coded_frame
);
111
112
return
0;
113
}
114
115
AVCodec
ff_v410_decoder
= {
116
.
name
=
"v410"
,
117
.type =
AVMEDIA_TYPE_VIDEO
,
118
.id =
AV_CODEC_ID_V410
,
119
.init =
v410_decode_init
,
120
.decode =
v410_decode_frame
,
121
.close =
v410_decode_close
,
122
.capabilities =
CODEC_CAP_DR1
,
123
.long_name =
NULL_IF_CONFIG_SMALL
(
"Uncompressed 4:4:4 10-bit"
),
124
};
Generated on Sat May 25 2013 03:58:41 for FFmpeg by
1.8.2