Libav
Main Page
Related Pages
Modules
Data Structures
Files
Examples
File List
Globals
libavcodec
v410enc.c
Go to the documentation of this file.
1
/*
2
* v410 encoder
3
*
4
* Copyright (c) 2011 Derek Buitenhuis
5
*
6
* This file is part of Libav.
7
*
8
* Libav 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
* Libav 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 Libav; if not, write to the Free Software
20
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21
*/
22
23
#include "
libavutil/common.h
"
24
#include "
libavutil/intreadwrite.h
"
25
#include "
avcodec.h
"
26
#include "
internal.h
"
27
28
static
av_cold
int
v410_encode_init
(
AVCodecContext
*avctx)
29
{
30
if
(avctx->
width
& 1) {
31
av_log
(avctx,
AV_LOG_ERROR
,
"v410 requires even width.\n"
);
32
return
AVERROR_INVALIDDATA
;
33
}
34
35
avctx->
coded_frame
=
av_frame_alloc
();
36
37
if
(!avctx->
coded_frame
) {
38
av_log
(avctx,
AV_LOG_ERROR
,
"Could not allocate frame.\n"
);
39
return
AVERROR
(ENOMEM);
40
}
41
42
return
0;
43
}
44
45
static
int
v410_encode_frame
(
AVCodecContext
*avctx,
AVPacket
*pkt,
46
const
AVFrame
*pic,
int
*got_packet)
47
{
48
uint8_t
*dst;
49
uint16_t *y, *u, *v;
50
uint32_t val;
51
int
i, j, ret;
52
53
if
((ret =
ff_alloc_packet
(pkt, avctx->
width
* avctx->
height
* 4)) < 0) {
54
av_log
(avctx,
AV_LOG_ERROR
,
"Error getting output packet.\n"
);
55
return
ret;
56
}
57
dst = pkt->
data
;
58
59
avctx->
coded_frame
->
key_frame
= 1;
60
avctx->
coded_frame
->
pict_type
=
AV_PICTURE_TYPE_I
;
61
62
y = (uint16_t *)pic->
data
[0];
63
u = (uint16_t *)pic->
data
[1];
64
v = (uint16_t *)pic->
data
[2];
65
66
for
(i = 0; i < avctx->
height
; i++) {
67
for
(j = 0; j < avctx->
width
; j++) {
68
val = u[j] << 2;
69
val |= y[j] << 12;
70
val |= (uint32_t) v[j] << 22;
71
AV_WL32
(dst, val);
72
dst += 4;
73
}
74
y += pic->
linesize
[0] >> 1;
75
u += pic->
linesize
[1] >> 1;
76
v += pic->
linesize
[2] >> 1;
77
}
78
79
pkt->
flags
|=
AV_PKT_FLAG_KEY
;
80
*got_packet = 1;
81
return
0;
82
}
83
84
static
av_cold
int
v410_encode_close
(
AVCodecContext
*avctx)
85
{
86
av_freep
(&avctx->
coded_frame
);
87
88
return
0;
89
}
90
91
AVCodec
ff_v410_encoder
= {
92
.
name
=
"v410"
,
93
.long_name =
NULL_IF_CONFIG_SMALL
(
"Uncompressed 4:4:4 10-bit"
),
94
.type =
AVMEDIA_TYPE_VIDEO
,
95
.id =
AV_CODEC_ID_V410
,
96
.init =
v410_encode_init
,
97
.encode2 =
v410_encode_frame
,
98
.close =
v410_encode_close
,
99
.pix_fmts = (
const
enum
AVPixelFormat
[]){
AV_PIX_FMT_YUV444P10
,
AV_PIX_FMT_NONE
},
100
};
Generated on Sun Jun 1 2014 17:55:34 for Libav by
1.8.1.2