FFmpeg
Main Page
Related Pages
Modules
Data Structures
Files
Examples
File List
Globals
•
All
Data Structures
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
avctx->
coded_frame
=
avcodec_alloc_frame
();
29
30
if
(avctx->
width
!= 720 || avctx->
height
!= 486 && avctx->
height
!= 576) {
31
av_log
(avctx,
AV_LOG_ERROR
,
"Only 720x486 and 720x576 are supported.\n"
);
32
return
AVERROR
(EINVAL);
33
}
34
if
(!avctx->
coded_frame
) {
35
av_log
(avctx,
AV_LOG_ERROR
,
"Could not allocate frame.\n"
);
36
return
AVERROR
(ENOMEM);
37
}
38
if
(!(avctx->
extradata
=
av_mallocz
(24 +
FF_INPUT_BUFFER_PADDING_SIZE
)))
39
return
AVERROR
(ENOMEM);
40
avctx->
extradata_size
= 24;
41
memcpy(avctx->
extradata
,
"\0\0\0\x18"
"APRGAPRG0001"
, 16);
42
if
(avctx->
field_order
>
AV_FIELD_PROGRESSIVE
) {
43
avctx->
extradata
[19] = 2;
44
}
else
{
45
avctx->
extradata
[19] = 1;
46
}
47
48
49
return
0;
50
}
51
52
static
int
avui_encode_frame
(
AVCodecContext
*avctx,
AVPacket
*
pkt
,
53
const
AVFrame
*pic,
int
*got_packet)
54
{
55
uint8_t
*
dst
, *src = pic->
data
[0];
56
int
i, j, skip, ret,
size
, interlaced;
57
58
interlaced = avctx->
field_order
>
AV_FIELD_PROGRESSIVE
;
59
60
if
(avctx->
height
== 486) {
61
skip = 10;
62
}
else
{
63
skip = 16;
64
}
65
size = 2 * avctx->
width
* (avctx->
height
+ skip) + 8 * interlaced;
66
if
((ret =
ff_alloc_packet2
(avctx, pkt, size)) < 0)
67
return
ret;
68
dst = pkt->
data
;
69
if
(!interlaced) {
70
dst += avctx->
width
* skip;
71
}
72
73
avctx->
coded_frame
->
reference
= 0;
74
avctx->
coded_frame
->
key_frame
= 1;
75
avctx->
coded_frame
->
pict_type
=
AV_PICTURE_TYPE_I
;
76
77
for
(i = 0; i <= interlaced; i++) {
78
if
(interlaced && avctx->
height
== 486) {
79
src = pic->
data
[0] + (1 - i) * pic->
linesize
[0];
80
}
else
{
81
src = pic->
data
[0] + i * pic->
linesize
[0];
82
}
83
dst += avctx->
width
* skip + 4 * i;
84
for
(j = 0; j < avctx->
height
; j += interlaced + 1) {
85
memcpy(dst, src, avctx->
width
* 2);
86
src += (interlaced + 1) * pic->
linesize
[0];
87
dst += avctx->
width
* 2;
88
}
89
}
90
91
pkt->
flags
|=
AV_PKT_FLAG_KEY
;
92
*got_packet = 1;
93
return
0;
94
}
95
96
static
av_cold
int
avui_encode_close
(
AVCodecContext
*avctx)
97
{
98
av_freep
(&avctx->
coded_frame
);
99
100
return
0;
101
}
102
103
AVCodec
ff_avui_encoder
= {
104
.
name
=
"avui"
,
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
.long_name =
NULL_IF_CONFIG_SMALL
(
"Avid Meridien Uncompressed"
),
113
};
Generated on Sat May 25 2013 03:58:31 for FFmpeg by
1.8.2