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