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
avuienc.c
Go to the documentation of this file.
1
/*
2
* AVID Meridien encoder
3
*
4
* Copyright (c) 2012 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
avui_encode_init
(
AVCodecContext
*avctx)
27
{
28
if
(avctx->
width
!= 720 || avctx->
height
!= 486 && avctx->
height
!= 576) {
29
av_log
(avctx,
AV_LOG_ERROR
,
"Only 720x486 and 720x576 are supported.\n"
);
30
return
AVERROR
(EINVAL);
31
}
32
if
(!(avctx->
extradata
=
av_mallocz
(24 +
FF_INPUT_BUFFER_PADDING_SIZE
)))
33
return
AVERROR
(ENOMEM);
34
avctx->
extradata_size
= 24;
35
memcpy(avctx->
extradata
,
"\0\0\0\x18"
"APRGAPRG0001"
, 16);
36
if
(avctx->
field_order
>
AV_FIELD_PROGRESSIVE
) {
37
avctx->
extradata
[19] = 2;
38
}
else
{
39
avctx->
extradata
[19] = 1;
40
}
41
42
avctx->
coded_frame
=
av_frame_alloc
();
43
if
(!avctx->
coded_frame
) {
44
av_log
(avctx,
AV_LOG_ERROR
,
"Could not allocate frame.\n"
);
45
return
AVERROR
(ENOMEM);
46
}
47
48
return
0;
49
}
50
51
static
int
avui_encode_frame
(
AVCodecContext
*avctx,
AVPacket
*
pkt
,
52
const
AVFrame
*pic,
int
*got_packet)
53
{
54
uint8_t
*dst;
55
int
i, j, skip,
ret
,
size
,
interlaced
;
56
57
interlaced = avctx->
field_order
>
AV_FIELD_PROGRESSIVE
;
58
59
if
(avctx->
height
== 486) {
60
skip = 10;
61
}
else
{
62
skip = 16;
63
}
64
size = 2 * avctx->
width
* (avctx->
height
+ skip) + 8 * interlaced;
65
if
((ret =
ff_alloc_packet2
(avctx, pkt, size)) < 0)
66
return
ret;
67
dst = pkt->
data
;
68
if
(!interlaced) {
69
dst += avctx->
width
* skip;
70
}
71
72
avctx->
coded_frame
->
key_frame
= 1;
73
avctx->
coded_frame
->
pict_type
=
AV_PICTURE_TYPE_I
;
74
75
for
(i = 0; i <=
interlaced
; i++) {
76
uint8_t
*
src
;
77
if
(interlaced && avctx->
height
== 486) {
78
src = pic->
data
[0] + (1 - i) * pic->
linesize
[0];
79
}
else
{
80
src = pic->
data
[0] + i * pic->
linesize
[0];
81
}
82
dst += avctx->
width
* skip + 4 * i;
83
for
(j = 0; j < avctx->
height
; j += interlaced + 1) {
84
memcpy(dst, src, avctx->
width
* 2);
85
src += (interlaced + 1) * pic->
linesize
[0];
86
dst += avctx->
width
* 2;
87
}
88
}
89
90
pkt->
flags
|=
AV_PKT_FLAG_KEY
;
91
*got_packet = 1;
92
return
0;
93
}
94
95
static
av_cold
int
avui_encode_close
(
AVCodecContext
*avctx)
96
{
97
av_freep
(&avctx->
coded_frame
);
98
99
return
0;
100
}
101
102
AVCodec
ff_avui_encoder
= {
103
.
name
=
"avui"
,
104
.long_name =
NULL_IF_CONFIG_SMALL
(
"Avid Meridien Uncompressed"
),
105
.type =
AVMEDIA_TYPE_VIDEO
,
106
.id =
AV_CODEC_ID_AVUI
,
107
.init =
avui_encode_init
,
108
.encode2 =
avui_encode_frame
,
109
.close =
avui_encode_close
,
110
.capabilities =
CODEC_CAP_EXPERIMENTAL
,
111
.pix_fmts = (
const
enum
AVPixelFormat
[]){
AV_PIX_FMT_UYVY422
,
AV_PIX_FMT_NONE
},
112
};
Generated on Fri Dec 5 2014 04:41:51 for FFmpeg by
1.8.2