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
y41penc.c
Go to the documentation of this file.
1
/*
2
* y41p encoder
3
*
4
* Copyright (c) 2012 Paul B Mahol
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
y41p_encode_init
(
AVCodecContext
*avctx)
27
{
28
if
(avctx->
width
& 7) {
29
av_log
(avctx,
AV_LOG_ERROR
,
"y41p requires width to be divisible by 8.\n"
);
30
return
AVERROR_INVALIDDATA
;
31
}
32
33
avctx->
coded_frame
=
av_frame_alloc
();
34
avctx->
bits_per_coded_sample
= 12;
35
36
if
(!avctx->
coded_frame
) {
37
av_log
(avctx,
AV_LOG_ERROR
,
"Could not allocate frame.\n"
);
38
return
AVERROR
(ENOMEM);
39
}
40
41
return
0;
42
}
43
44
static
int
y41p_encode_frame
(
AVCodecContext
*avctx,
AVPacket
*
pkt
,
45
const
AVFrame
*pic,
int
*got_packet)
46
{
47
uint8_t
*dst;
48
uint8_t
*
y
, *
u
, *
v
;
49
int
i, j,
ret
;
50
51
if
((ret =
ff_alloc_packet2
(avctx, pkt, avctx->
width
* avctx->
height
* 1.5)) < 0)
52
return
ret
;
53
54
avctx->
coded_frame
->
key_frame
= 1;
55
avctx->
coded_frame
->
pict_type
=
AV_PICTURE_TYPE_I
;
56
dst = pkt->
data
;
57
58
for
(i = avctx->
height
- 1; i >= 0; i--) {
59
y = &pic->
data
[0][i * pic->
linesize
[0]];
60
u = &pic->
data
[1][i * pic->
linesize
[1]];
61
v = &pic->
data
[2][i * pic->
linesize
[2]];
62
for
(j = 0; j < avctx->
width
; j += 8) {
63
*(dst++) = *(u++);
64
*(dst++) = *(y++);
65
*(dst++) = *(v++);
66
*(dst++) = *(y++);
67
68
*(dst++) = *(u++);
69
*(dst++) = *(y++);
70
*(dst++) = *(v++);
71
*(dst++) = *(y++);
72
73
*(dst++) = *(y++);
74
*(dst++) = *(y++);
75
*(dst++) = *(y++);
76
*(dst++) = *(y++);
77
}
78
}
79
80
pkt->
flags
|=
AV_PKT_FLAG_KEY
;
81
*got_packet = 1;
82
return
0;
83
}
84
85
static
av_cold
int
y41p_encode_close
(
AVCodecContext
*avctx)
86
{
87
av_freep
(&avctx->
coded_frame
);
88
89
return
0;
90
}
91
92
AVCodec
ff_y41p_encoder
= {
93
.
name
=
"y41p"
,
94
.long_name =
NULL_IF_CONFIG_SMALL
(
"Uncompressed YUV 4:1:1 12-bit"
),
95
.type =
AVMEDIA_TYPE_VIDEO
,
96
.id =
AV_CODEC_ID_Y41P
,
97
.init =
y41p_encode_init
,
98
.encode2 =
y41p_encode_frame
,
99
.close =
y41p_encode_close
,
100
.pix_fmts = (
const
enum
AVPixelFormat
[]) {
AV_PIX_FMT_YUV411P
,
101
AV_PIX_FMT_NONE
},
102
};
Generated on Sun Mar 23 2014 23:50:06 for FFmpeg by
1.8.2