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
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
return
0;
31
}
32
33
static
int
yuv4_decode_frame
(
AVCodecContext
*avctx,
void
*
data
,
34
int
*got_frame,
AVPacket
*avpkt)
35
{
36
AVFrame
*pic =
data
;
37
const
uint8_t
*
src
= avpkt->
data
;
38
uint8_t
*
y
, *
u
, *
v
;
39
int
i, j,
ret
;
40
41
if
(avpkt->
size
< 6 * (avctx->
width
+ 1 >> 1) * (avctx->
height
+ 1 >> 1)) {
42
av_log
(avctx,
AV_LOG_ERROR
,
"Insufficient input data.\n"
);
43
return
AVERROR
(EINVAL);
44
}
45
46
if
((ret =
ff_get_buffer
(avctx, pic, 0)) < 0)
47
return
ret
;
48
49
pic->
key_frame
= 1;
50
pic->
pict_type
=
AV_PICTURE_TYPE_I
;
51
52
y = pic->
data
[0];
53
u = pic->
data
[1];
54
v = pic->
data
[2];
55
56
for
(i = 0; i < (avctx->
height
+ 1) >> 1; i++) {
57
for
(j = 0; j < (avctx->
width
+ 1) >> 1; j++) {
58
u[j] = *src++ ^ 0x80;
59
v[j] = *src++ ^ 0x80;
60
y[ 2 * j ] = *src++;
61
y[ 2 * j + 1] = *src++;
62
y[pic->
linesize
[0] + 2 * j ] = *src++;
63
y[pic->
linesize
[0] + 2 * j + 1] = *src++;
64
}
65
66
y += 2 * pic->
linesize
[0];
67
u += pic->
linesize
[1];
68
v += pic->
linesize
[2];
69
}
70
71
*got_frame = 1;
72
73
return
avpkt->
size
;
74
}
75
76
AVCodec
ff_yuv4_decoder
= {
77
.
name
=
"yuv4"
,
78
.long_name =
NULL_IF_CONFIG_SMALL
(
"Uncompressed packed 4:2:0"
),
79
.type =
AVMEDIA_TYPE_VIDEO
,
80
.id =
AV_CODEC_ID_YUV4
,
81
.init =
yuv4_decode_init
,
82
.decode =
yuv4_decode_frame
,
83
.capabilities =
CODEC_CAP_DR1
,
84
};
Generated on Sat Jan 25 2014 19:51:58 for FFmpeg by
1.8.2