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
yuv4enc.c
Go to the documentation of this file.
1
/*
2
* libquicktime yuv4 encoder
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_encode_init
(
AVCodecContext
*avctx)
27
{
28
avctx->
coded_frame
=
avcodec_alloc_frame
();
29
30
if
(!avctx->
coded_frame
) {
31
av_log
(avctx,
AV_LOG_ERROR
,
"Could not allocate frame.\n"
);
32
return
AVERROR
(ENOMEM);
33
}
34
35
return
0;
36
}
37
38
static
int
yuv4_encode_frame
(
AVCodecContext
*avctx,
AVPacket
*
pkt
,
39
const
AVFrame
*pic,
int
*got_packet)
40
{
41
uint8_t
*dst;
42
uint8_t
*
y
, *
u
, *
v
;
43
int
i, j,
ret
;
44
45
if
((ret =
ff_alloc_packet2
(avctx, pkt, 6 * (avctx->
width
+ 1 >> 1) * (avctx->
height
+ 1 >> 1))) < 0)
46
return
ret
;
47
dst = pkt->
data
;
48
49
avctx->
coded_frame
->
key_frame
= 1;
50
avctx->
coded_frame
->
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
*dst++ = u[j] ^ 0x80;
59
*dst++ = v[j] ^ 0x80;
60
*dst++ = y[ 2 * j ];
61
*dst++ = y[ 2 * j + 1];
62
*dst++ = y[pic->
linesize
[0] + 2 * j ];
63
*dst++ = y[pic->
linesize
[0] + 2 * j + 1];
64
}
65
y += 2 * pic->
linesize
[0];
66
u += pic->
linesize
[1];
67
v += pic->
linesize
[2];
68
}
69
70
pkt->
flags
|=
AV_PKT_FLAG_KEY
;
71
*got_packet = 1;
72
return
0;
73
}
74
75
static
av_cold
int
yuv4_encode_close
(
AVCodecContext
*avctx)
76
{
77
av_freep
(&avctx->
coded_frame
);
78
79
return
0;
80
}
81
82
AVCodec
ff_yuv4_encoder
= {
83
.
name
=
"yuv4"
,
84
.long_name =
NULL_IF_CONFIG_SMALL
(
"Uncompressed packed 4:2:0"
),
85
.type =
AVMEDIA_TYPE_VIDEO
,
86
.id =
AV_CODEC_ID_YUV4
,
87
.init =
yuv4_encode_init
,
88
.encode2 =
yuv4_encode_frame
,
89
.close =
yuv4_encode_close
,
90
.pix_fmts = (
const
enum
AVPixelFormat
[]){
AV_PIX_FMT_YUV420P
,
AV_PIX_FMT_NONE
},
91
};
Generated on Sat Jan 25 2014 19:51:58 for FFmpeg by
1.8.2