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
v308dec.c
Go to the documentation of this file.
1
/*
2
* v308 decoder
3
* Copyright (c) 2011 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
v308_decode_init
(
AVCodecContext
*avctx)
26
{
27
avctx->
pix_fmt
=
AV_PIX_FMT_YUV444P
;
28
29
if
(avctx->
width
& 1)
30
av_log
(avctx,
AV_LOG_WARNING
,
"v308 requires width to be even.\n"
);
31
32
avctx->
coded_frame
=
avcodec_alloc_frame
();
33
34
if
(!avctx->
coded_frame
) {
35
av_log
(avctx,
AV_LOG_ERROR
,
"Could not allocate frame.\n"
);
36
return
AVERROR
(ENOMEM);
37
}
38
39
return
0;
40
}
41
42
static
int
v308_decode_frame
(
AVCodecContext
*avctx,
void
*
data
,
43
int
*got_frame,
AVPacket
*avpkt)
44
{
45
AVFrame
*pic = avctx->
coded_frame
;
46
const
uint8_t
*src = avpkt->
data
;
47
uint8_t
*y, *u, *v;
48
int
i, j;
49
50
if
(pic->
data
[0])
51
avctx->
release_buffer
(avctx, pic);
52
53
if
(avpkt->
size
< 3 * avctx->
height
* avctx->
width
) {
54
av_log
(avctx,
AV_LOG_ERROR
,
"Insufficient input data.\n"
);
55
return
AVERROR
(EINVAL);
56
}
57
58
pic->
reference
= 0;
59
60
if
(
ff_get_buffer
(avctx, pic) < 0) {
61
av_log
(avctx,
AV_LOG_ERROR
,
"Could not allocate buffer.\n"
);
62
return
AVERROR
(ENOMEM);
63
}
64
65
pic->
key_frame
= 1;
66
pic->
pict_type
=
AV_PICTURE_TYPE_I
;
67
68
y = pic->
data
[0];
69
u = pic->
data
[1];
70
v = pic->
data
[2];
71
72
for
(i = 0; i < avctx->
height
; i++) {
73
for
(j = 0; j < avctx->
width
; j++) {
74
v[j] = *src++;
75
y[j] = *src++;
76
u[j] = *src++;
77
}
78
79
y += pic->
linesize
[0];
80
u += pic->
linesize
[1];
81
v += pic->
linesize
[2];
82
}
83
84
*got_frame = 1;
85
*(
AVFrame
*)data = *pic;
86
87
return
avpkt->
size
;
88
}
89
90
static
av_cold
int
v308_decode_close
(
AVCodecContext
*avctx)
91
{
92
if
(avctx->
coded_frame
->
data
[0])
93
avctx->
release_buffer
(avctx, avctx->
coded_frame
);
94
95
av_freep
(&avctx->
coded_frame
);
96
97
return
0;
98
}
99
100
AVCodec
ff_v308_decoder
= {
101
.
name
=
"v308"
,
102
.type =
AVMEDIA_TYPE_VIDEO
,
103
.id =
AV_CODEC_ID_V308
,
104
.init =
v308_decode_init
,
105
.decode =
v308_decode_frame
,
106
.close =
v308_decode_close
,
107
.capabilities =
CODEC_CAP_DR1
,
108
.long_name =
NULL_IF_CONFIG_SMALL
(
"Uncompressed packed 4:4:4"
),
109
};
Generated on Sat May 25 2013 03:58:41 for FFmpeg by
1.8.2