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
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
return
0;
43
}
44
45
static
int
v410_decode_frame
(
AVCodecContext
*avctx,
void
*
data
,
46
int
*got_frame,
AVPacket
*avpkt)
47
{
48
AVFrame
*pic =
data
;
49
uint8_t
*
src
= avpkt->
data
;
50
uint16_t *
y
, *
u
, *
v
;
51
uint32_t
val
;
52
int
i, j,
ret
;
53
54
if
(avpkt->
size
< 4 * avctx->
height
* avctx->
width
) {
55
av_log
(avctx,
AV_LOG_ERROR
,
"Insufficient input data.\n"
);
56
return
AVERROR
(EINVAL);
57
}
58
59
if
((ret =
ff_get_buffer
(avctx, pic, 0)) < 0)
60
return
ret
;
61
62
pic->
key_frame
= 1;
63
pic->
pict_type
=
AV_PICTURE_TYPE_I
;
64
65
y = (uint16_t *)pic->
data
[0];
66
u = (uint16_t *)pic->
data
[1];
67
v = (uint16_t *)pic->
data
[2];
68
69
for
(i = 0; i < avctx->
height
; i++) {
70
for
(j = 0; j < avctx->
width
; j++) {
71
val =
AV_RL32
(src);
72
73
u[j] = (val >> 2) & 0x3FF;
74
y[j] = (val >> 12) & 0x3FF;
75
v[j] = (val >> 22);
76
77
src += 4;
78
}
79
80
y += pic->
linesize
[0] >> 1;
81
u += pic->
linesize
[1] >> 1;
82
v += pic->
linesize
[2] >> 1;
83
}
84
85
*got_frame = 1;
86
87
return
avpkt->
size
;
88
}
89
90
AVCodec
ff_v410_decoder
= {
91
.
name
=
"v410"
,
92
.long_name =
NULL_IF_CONFIG_SMALL
(
"Uncompressed 4:4:4 10-bit"
),
93
.type =
AVMEDIA_TYPE_VIDEO
,
94
.id =
AV_CODEC_ID_V410
,
95
.init =
v410_decode_init
,
96
.decode =
v410_decode_frame
,
97
.capabilities =
CODEC_CAP_DR1
,
98
};
Generated on Sun Mar 23 2014 23:50:04 for FFmpeg by
1.8.2