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
v408dec.c
Go to the documentation of this file.
1
/*
2
* v408 decoder
3
* Copyright (c) 2012 Carl Eugen Hoyos
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
#include "
avcodec.h
"
23
#include "
internal.h
"
24
25
static
av_cold
int
v408_decode_init
(
AVCodecContext
*avctx)
26
{
27
avctx->
pix_fmt
=
AV_PIX_FMT_YUVA444P
;
28
29
avctx->
coded_frame
=
avcodec_alloc_frame
();
30
31
if
(!avctx->
coded_frame
) {
32
av_log
(avctx,
AV_LOG_ERROR
,
"Could not allocate frame.\n"
);
33
return
AVERROR
(ENOMEM);
34
}
35
36
return
0;
37
}
38
39
static
int
v408_decode_frame
(
AVCodecContext
*avctx,
void
*
data
,
40
int
*got_frame,
AVPacket
*avpkt)
41
{
42
AVFrame
*pic = avctx->
coded_frame
;
43
const
uint8_t
*src = avpkt->
data
;
44
uint8_t
*y, *u, *v, *
a
;
45
int
i, j;
46
47
if
(pic->
data
[0])
48
avctx->
release_buffer
(avctx, pic);
49
50
if
(avpkt->
size
< 4 * avctx->
height
* avctx->
width
) {
51
av_log
(avctx,
AV_LOG_ERROR
,
"Insufficient input data.\n"
);
52
return
AVERROR
(EINVAL);
53
}
54
55
pic->
reference
= 0;
56
57
if
(
ff_get_buffer
(avctx, pic) < 0) {
58
av_log
(avctx,
AV_LOG_ERROR
,
"Could not allocate buffer.\n"
);
59
return
AVERROR
(ENOMEM);
60
}
61
62
pic->
key_frame
= 1;
63
pic->
pict_type
=
AV_PICTURE_TYPE_I
;
64
65
y = pic->
data
[0];
66
u = pic->
data
[1];
67
v = pic->
data
[2];
68
a = pic->
data
[3];
69
70
for
(i = 0; i < avctx->
height
; i++) {
71
for
(j = 0; j < avctx->
width
; j++) {
72
if
(avctx->
codec_id
==
AV_CODEC_ID_AYUV
) {
73
v[j] = *src++;
74
u[j] = *src++;
75
y[j] = *src++;
76
a[j] = *src++;
77
}
else
{
78
u[j] = *src++;
79
y[j] = *src++;
80
v[j] = *src++;
81
a[j] = *src++;
82
}
83
}
84
85
y += pic->
linesize
[0];
86
u += pic->
linesize
[1];
87
v += pic->
linesize
[2];
88
a += pic->
linesize
[3];
89
}
90
91
*got_frame = 1;
92
*(
AVFrame
*)data = *pic;
93
94
return
avpkt->
size
;
95
}
96
97
static
av_cold
int
v408_decode_close
(
AVCodecContext
*avctx)
98
{
99
if
(avctx->
coded_frame
->
data
[0])
100
avctx->
release_buffer
(avctx, avctx->
coded_frame
);
101
102
av_freep
(&avctx->
coded_frame
);
103
104
return
0;
105
}
106
107
#if CONFIG_AYUV_DECODER
108
AVCodec
ff_ayuv_decoder = {
109
.
name
=
"ayuv"
,
110
.type =
AVMEDIA_TYPE_VIDEO
,
111
.id =
AV_CODEC_ID_AYUV
,
112
.init =
v408_decode_init
,
113
.decode =
v408_decode_frame
,
114
.close =
v408_decode_close
,
115
.capabilities =
CODEC_CAP_DR1
,
116
.long_name =
NULL_IF_CONFIG_SMALL
(
"Uncompressed packed MS 4:4:4:4"
),
117
};
118
#endif
119
#if CONFIG_V408_DECODER
120
AVCodec
ff_v408_decoder = {
121
.
name
=
"v408"
,
122
.type =
AVMEDIA_TYPE_VIDEO
,
123
.id =
AV_CODEC_ID_V408
,
124
.init =
v408_decode_init
,
125
.decode =
v408_decode_frame
,
126
.close =
v408_decode_close
,
127
.capabilities =
CODEC_CAP_DR1
,
128
.long_name =
NULL_IF_CONFIG_SMALL
(
"Uncompressed packed QT 4:4:4:4"
),
129
};
130
#endif
Generated on Sat May 25 2013 03:58:41 for FFmpeg by
1.8.2