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