FFmpeg
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
int
yuv4_encode_frame
(
AVCodecContext
*avctx,
AVPacket
*
pkt
,
27
const
AVFrame
*pic,
int
*got_packet)
28
{
29
uint8_t
*dst;
30
uint8_t
*y, *
u
, *v;
31
int
i
, j,
ret
;
32
33
if
((
ret
=
ff_alloc_packet2
(avctx,
pkt
, 6 * (avctx->
width
+ 1 >> 1) * (avctx->
height
+ 1 >> 1), 0)) < 0)
34
return
ret
;
35
dst =
pkt
->
data
;
36
37
y = pic->
data
[0];
38
u
= pic->
data
[1];
39
v = pic->
data
[2];
40
41
for
(
i
= 0;
i
< avctx->
height
+ 1 >> 1;
i
++) {
42
for
(j = 0; j < avctx->
width
+ 1 >> 1; j++) {
43
*dst++ =
u
[j] ^ 0x80;
44
*dst++ = v[j] ^ 0x80;
45
*dst++ = y[ 2 * j ];
46
*dst++ = y[ 2 * j + 1];
47
*dst++ = y[pic->
linesize
[0] + 2 * j ];
48
*dst++ = y[pic->
linesize
[0] + 2 * j + 1];
49
}
50
y += 2 * pic->
linesize
[0];
51
u
+= pic->
linesize
[1];
52
v += pic->
linesize
[2];
53
}
54
55
pkt
->
flags
|=
AV_PKT_FLAG_KEY
;
56
*got_packet = 1;
57
return
0;
58
}
59
60
AVCodec
ff_yuv4_encoder
= {
61
.
name
=
"yuv4"
,
62
.long_name =
NULL_IF_CONFIG_SMALL
(
"Uncompressed packed 4:2:0"
),
63
.type =
AVMEDIA_TYPE_VIDEO
,
64
.id =
AV_CODEC_ID_YUV4
,
65
.encode2 =
yuv4_encode_frame
,
66
.pix_fmts = (
const
enum
AVPixelFormat
[]){
AV_PIX_FMT_YUV420P
,
AV_PIX_FMT_NONE
},
67
};
AVCodec
AVCodec.
Definition:
codec.h:197
AVPixelFormat
AVPixelFormat
Pixel format.
Definition:
pixfmt.h:64
u
#define u(width, name, range_min, range_max)
Definition:
cbs_h2645.c:264
ff_yuv4_encoder
AVCodec ff_yuv4_encoder
Definition:
yuv4enc.c:60
AVFrame
This structure describes decoded (raw) audio or video data.
Definition:
frame.h:318
internal.h
AVPacket::data
uint8_t * data
Definition:
packet.h:369
AV_PKT_FLAG_KEY
#define AV_PKT_FLAG_KEY
The packet contains a keyframe.
Definition:
packet.h:410
AVFrame::data
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
Definition:
frame.h:332
AV_CODEC_ID_YUV4
@ AV_CODEC_ID_YUV4
Definition:
codec_id.h:258
pkt
AVPacket * pkt
Definition:
movenc.c:59
yuv4_encode_frame
static int yuv4_encode_frame(AVCodecContext *avctx, AVPacket *pkt, const AVFrame *pic, int *got_packet)
Definition:
yuv4enc.c:26
AV_PIX_FMT_YUV420P
@ AV_PIX_FMT_YUV420P
planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
Definition:
pixfmt.h:66
NULL_IF_CONFIG_SMALL
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
Definition:
internal.h:117
AVPacket::flags
int flags
A combination of AV_PKT_FLAG values.
Definition:
packet.h:375
i
int i
Definition:
input.c:407
uint8_t
uint8_t
Definition:
audio_convert.c:194
AVCodec::name
const char * name
Name of the codec implementation.
Definition:
codec.h:204
AVCodecContext::height
int height
Definition:
avcodec.h:709
avcodec.h
ret
ret
Definition:
filter_design.txt:187
AVCodecContext
main external API structure.
Definition:
avcodec.h:536
AV_PIX_FMT_NONE
@ AV_PIX_FMT_NONE
Definition:
pixfmt.h:65
AVMEDIA_TYPE_VIDEO
@ AVMEDIA_TYPE_VIDEO
Definition:
avutil.h:201
AVPacket
This structure stores compressed data.
Definition:
packet.h:346
AVCodecContext::width
int width
picture width / height.
Definition:
avcodec.h:709
AVFrame::linesize
int linesize[AV_NUM_DATA_POINTERS]
For video, size in bytes of each picture line.
Definition:
frame.h:349
ff_alloc_packet2
int ff_alloc_packet2(AVCodecContext *avctx, AVPacket *avpkt, int64_t size, int64_t min_size)
Check AVPacket size and/or allocate data.
Definition:
encode.c:33
Generated on Wed Aug 24 2022 21:34:23 for FFmpeg by
1.8.17