annotate gxfenc.c @ 2065:64bd1b09cef2 libavformat

patch so that the deprecated items show up correctly when building doxygen docs patch by mark cox melbournemark plus ffmpeg minus devel chez gmail dot com
author benoit
date Wed, 02 May 2007 09:13:47 +0000
parents 11c57b75bccd
children b7950418654d
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1183
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
1 /*
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
2 * GXF muxer.
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
3 * Copyright (c) 2006 SmartJog S.A., Baptiste Coudurier <baptiste dot coudurier at smartjog dot com>.
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
4 *
1358
0899bfe4105c Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 1322
diff changeset
5 * This file is part of FFmpeg.
0899bfe4105c Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 1322
diff changeset
6 *
0899bfe4105c Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 1322
diff changeset
7 * FFmpeg is free software; you can redistribute it and/or modify
1183
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
8 * it under the terms of the GNU General Public License as published by
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
9 * the Free Software Foundation; either version 2 of the License, or
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
10 * (at your option) any later version.
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
11 *
1358
0899bfe4105c Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 1322
diff changeset
12 * FFmpeg is distributed in the hope that it will be useful,
1183
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
15 * GNU General Public License for more details.
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
16 *
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
17 * You should have received a copy of the GNU General Public License
1698
3590d0e5661b Fix some more license headers.
diego
parents: 1677
diff changeset
18 * along with FFmpeg; if not, write to the Free Software
1358
0899bfe4105c Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 1322
diff changeset
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
1183
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
20 */
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
21
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
22 #include "avformat.h"
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
23 #include "gxf.h"
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
24 #include "riff.h"
1322
95f56c7b24eb * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents: 1262
diff changeset
25 #include "fifo.h"
1183
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
26
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
27 #define GXF_AUDIO_PACKET_SIZE 65536
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
28
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
29 typedef struct GXFStreamContext {
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
30 AVCodecContext *codec;
1322
95f56c7b24eb * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents: 1262
diff changeset
31 AVFifoBuffer audio_buffer;
1183
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
32 uint32_t track_type;
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
33 uint32_t sample_size;
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
34 uint32_t sample_rate;
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
35 uint16_t media_type;
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
36 uint16_t media_info;
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
37 uint8_t index;
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
38 int frame_rate_index;
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
39 int lines_index;
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
40 int fields;
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
41 int iframes;
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
42 int pframes;
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
43 int bframes;
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
44 int p_per_gop;
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
45 int b_per_gop;
1261
e03e8ce942e8 rename closed_gop to first_gop_closed
bcoudurier
parents: 1260
diff changeset
46 int first_gop_closed;
1253
f3d5e1c49875 use packet dts as correct media field number and use av_interleave_pkt_per_dts
bcoudurier
parents: 1247
diff changeset
47 int64_t current_dts;
1542
98ef8d631737 readjust dts if negative
bcoudurier
parents: 1401
diff changeset
48 int dts_delay;
1183
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
49 } GXFStreamContext;
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
50
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
51 typedef struct GXFContext {
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
52 uint32_t nb_frames;
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
53 uint32_t material_flags;
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
54 uint16_t audio_tracks;
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
55 uint16_t mpeg_tracks;
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
56 int64_t creation_time;
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
57 uint32_t umf_start_offset;
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
58 uint32_t umf_track_offset;
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
59 uint32_t umf_media_offset;
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
60 uint32_t umf_user_data_offset;
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
61 uint32_t umf_user_data_size;
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
62 uint32_t umf_length;
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
63 uint16_t umf_track_size;
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
64 uint16_t umf_media_size;
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
65 int audio_written;
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
66 int sample_rate;
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
67 int flags;
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
68 AVFormatContext *fc;
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
69 GXFStreamContext streams[48];
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
70 } GXFContext;
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
71
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
72 typedef struct GXF_Lines {
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
73 int height;
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
74 int index;
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
75 } GXF_Lines;
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
76
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
77
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
78 /* FIXME check if it is relevant */
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
79 static const GXF_Lines gxf_lines_tab[] = {
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
80 { 480, 1 }, /* NTSC */
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
81 { 512, 1 }, /* NTSC + VBI */
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
82 { 576, 2 }, /* PAL */
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
83 { 608, 2 }, /* PAL + VBI */
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
84 { 1080, 4 },
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
85 { 720, 6 },
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
86 };
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
87
1677
2a85c82b8538 add codec_id <-> codec_tag tables to AVIn/OutputFormat
michael
parents: 1542
diff changeset
88 static const AVCodecTag gxf_media_types[] = {
1183
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
89 { CODEC_ID_MJPEG , 3 }, /* NTSC */
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
90 { CODEC_ID_MJPEG , 4 }, /* PAL */
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
91 { CODEC_ID_PCM_S24LE , 9 },
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
92 { CODEC_ID_PCM_S16LE , 10 },
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
93 { CODEC_ID_MPEG2VIDEO, 11 }, /* NTSC */
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
94 { CODEC_ID_MPEG2VIDEO, 12 }, /* PAL */
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
95 { CODEC_ID_DVVIDEO , 13 }, /* NTSC */
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
96 { CODEC_ID_DVVIDEO , 14 }, /* PAL */
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
97 { CODEC_ID_DVVIDEO , 15 }, /* 50M NTSC */
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
98 { CODEC_ID_DVVIDEO , 16 }, /* 50M PAL */
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
99 { CODEC_ID_AC3 , 17 },
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
100 //{ CODEC_ID_NONE, , 18 }, /* Non compressed 24 bit audio */
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
101 { CODEC_ID_MPEG2VIDEO, 20 }, /* MPEG HD */
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
102 { CODEC_ID_MPEG1VIDEO, 22 }, /* NTSC */
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
103 { CODEC_ID_MPEG1VIDEO, 23 }, /* PAL */
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
104 { 0, 0 },
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
105 };
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
106
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
107 #define SERVER_PATH "/space/"
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
108 #define ES_NAME_PATTERN "ES."
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
109
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
110 static int gxf_find_lines_index(GXFStreamContext *ctx)
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
111 {
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
112 int i;
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
113
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
114 for (i = 0; i < 6; ++i) {
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
115 if (ctx->codec->height == gxf_lines_tab[i].height) {
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
116 ctx->lines_index = gxf_lines_tab[i].index;
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
117 return 0;
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
118 }
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
119 }
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
120 return -1;
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
121 }
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
122
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
123 static void gxf_write_padding(ByteIOContext *pb, offset_t to_pad)
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
124 {
1213
fe9ebf4ce09e negative to_pad won't provoke infinite loop
bcoudurier
parents: 1212
diff changeset
125 for (; to_pad > 0; to_pad--) {
1183
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
126 put_byte(pb, 0);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
127 }
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
128 }
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
129
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
130 static offset_t updatePacketSize(ByteIOContext *pb, offset_t pos)
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
131 {
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
132 offset_t curpos;
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
133 int size;
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
134
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
135 size = url_ftell(pb) - pos;
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
136 if (size % 4) {
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
137 gxf_write_padding(pb, 4 - size % 4);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
138 size = url_ftell(pb) - pos;
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
139 }
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
140 curpos = url_ftell(pb);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
141 url_fseek(pb, pos + 6, SEEK_SET);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
142 put_be32(pb, size);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
143 url_fseek(pb, curpos, SEEK_SET);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
144 return curpos - pos;
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
145 }
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
146
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
147 static offset_t updateSize(ByteIOContext *pb, offset_t pos)
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
148 {
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
149 offset_t curpos;
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
150
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
151 curpos = url_ftell(pb);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
152 url_fseek(pb, pos, SEEK_SET);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
153 put_be16(pb, curpos - pos - 2);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
154 url_fseek(pb, curpos, SEEK_SET);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
155 return curpos - pos;
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
156 }
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
157
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
158 static void gxf_write_packet_header(ByteIOContext *pb, pkt_type_t type)
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
159 {
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
160 put_be32(pb, 0); /* packet leader for synchro */
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
161 put_byte(pb, 1);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
162 put_byte(pb, type); /* map packet */
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
163 put_be32(pb, 0); /* size */
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
164 put_be32(pb, 0); /* reserved */
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
165 put_byte(pb, 0xE1); /* trailer 1 */
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
166 put_byte(pb, 0xE2); /* trailer 2 */
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
167 }
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
168
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
169 static int gxf_write_mpeg_auxiliary(ByteIOContext *pb, GXFStreamContext *ctx)
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
170 {
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
171 char buffer[1024];
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
172 int size;
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
173
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
174 if (ctx->iframes) {
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
175 ctx->p_per_gop = ctx->pframes / ctx->iframes;
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
176 if (ctx->pframes % ctx->iframes)
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
177 ctx->p_per_gop++;
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
178 if (ctx->pframes)
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
179 ctx->b_per_gop = ctx->bframes / ctx->pframes;
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
180 if (ctx->p_per_gop > 9)
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
181 ctx->p_per_gop = 9; /* ensure value won't take more than one char */
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
182 if (ctx->b_per_gop > 9)
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
183 ctx->b_per_gop = 9; /* ensure value won't take more than one char */
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
184 }
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
185 size = snprintf(buffer, 1024, "Ver 1\nBr %.6f\nIpg 1\nPpi %d\nBpiop %d\n"
1247
2f118b3e65c6 parse mpeg frame to get pict type and closed gop flag
bcoudurier
parents: 1213
diff changeset
186 "Pix 0\nCf %d\nCg %d\nSl 7\nnl16 %d\nVi 1\nf1 1\n",
1183
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
187 (float)ctx->codec->bit_rate, ctx->p_per_gop, ctx->b_per_gop,
1262
8da1b141e83a set correct first gop closed value
bcoudurier
parents: 1261
diff changeset
188 ctx->codec->pix_fmt == PIX_FMT_YUV422P ? 2 : 1, ctx->first_gop_closed == 1,
1183
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
189 ctx->codec->height / 16);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
190 put_byte(pb, 0x4F);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
191 put_byte(pb, size + 1);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
192 put_buffer(pb, (uint8_t *)buffer, size + 1);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
193 return size + 3;
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
194 }
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
195
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
196 static int gxf_write_timecode_auxiliary(ByteIOContext *pb, GXFStreamContext *ctx)
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
197 {
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
198 /* FIXME implement that */
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
199 put_byte(pb, 0); /* fields */
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
200 put_byte(pb, 0); /* seconds */
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
201 put_byte(pb, 0); /* minutes */
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
202 put_byte(pb, 0); /* flags + hours */
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
203 /* reserved */
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
204 put_be32(pb, 0);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
205 return 8;
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
206 }
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
207
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
208 static int gxf_write_track_description(ByteIOContext *pb, GXFStreamContext *stream)
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
209 {
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
210 offset_t pos;
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
211
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
212 /* track description section */
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
213 put_byte(pb, stream->media_type + 0x80);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
214 put_byte(pb, stream->index + 0xC0);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
215
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
216 pos = url_ftell(pb);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
217 put_be16(pb, 0); /* size */
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
218
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
219 /* media file name */
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
220 put_byte(pb, 0x4C);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
221 put_byte(pb, strlen(ES_NAME_PATTERN) + 3);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
222 put_tag(pb, ES_NAME_PATTERN);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
223 put_be16(pb, stream->media_info);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
224 put_byte(pb, 0);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
225
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
226 if (stream->codec->codec_id != CODEC_ID_MPEG2VIDEO) {
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
227 /* auxiliary information */
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
228 put_byte(pb, 0x4D);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
229 put_byte(pb, 8);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
230 if (stream->codec->codec_id == CODEC_ID_NONE)
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
231 gxf_write_timecode_auxiliary(pb, stream);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
232 else
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
233 put_le64(pb, 0);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
234 }
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
235
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
236 /* file system version */
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
237 put_byte(pb, 0x4E);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
238 put_byte(pb, 4);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
239 put_be32(pb, 0);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
240
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
241 if (stream->codec->codec_id == CODEC_ID_MPEG2VIDEO)
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
242 gxf_write_mpeg_auxiliary(pb, stream);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
243
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
244 /* frame rate */
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
245 put_byte(pb, 0x50);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
246 put_byte(pb, 4);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
247 put_be32(pb, stream->frame_rate_index);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
248
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
249 /* lines per frame */
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
250 put_byte(pb, 0x51);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
251 put_byte(pb, 4);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
252 put_be32(pb, stream->lines_index);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
253
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
254 /* fields per frame */
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
255 put_byte(pb, 0x52);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
256 put_byte(pb, 4);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
257 put_be32(pb, stream->fields);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
258
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
259 return updateSize(pb, pos);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
260 }
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
261
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
262 static int gxf_write_material_data_section(ByteIOContext *pb, GXFContext *ctx)
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
263 {
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
264 offset_t pos;
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
265 const char *filename = strrchr(ctx->fc->filename, '/');
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
266
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
267 pos = url_ftell(pb);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
268 put_be16(pb, 0); /* size */
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
269
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
270 /* name */
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
271 if (filename)
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
272 filename++;
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
273 else
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
274 filename = ctx->fc->filename;
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
275 put_byte(pb, 0x40);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
276 put_byte(pb, strlen(SERVER_PATH) + strlen(filename) + 1);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
277 put_tag(pb, SERVER_PATH);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
278 put_tag(pb, filename);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
279 put_byte(pb, 0);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
280
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
281 /* first field */
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
282 put_byte(pb, 0x41);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
283 put_byte(pb, 4);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
284 put_be32(pb, 0);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
285
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
286 /* last field */
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
287 put_byte(pb, 0x42);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
288 put_byte(pb, 4);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
289 put_be32(pb, ctx->nb_frames);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
290
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
291 /* reserved */
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
292 put_byte(pb, 0x43);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
293 put_byte(pb, 4);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
294 put_be32(pb, 0);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
295
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
296 put_byte(pb, 0x44);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
297 put_byte(pb, 4);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
298 put_be32(pb, ctx->nb_frames);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
299
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
300 /* estimated size */
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
301 put_byte(pb, 0x45);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
302 put_byte(pb, 4);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
303 put_be32(pb, url_fsize(pb) / 1024);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
304
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
305 return updateSize(pb, pos);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
306 }
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
307
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
308 static int gxf_write_track_description_section(ByteIOContext *pb, GXFContext *ctx)
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
309 {
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
310 offset_t pos;
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
311 int i;
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
312
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
313 pos = url_ftell(pb);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
314 put_be16(pb, 0); /* size */
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
315 for (i = 0; i < ctx->fc->nb_streams; ++i)
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
316 gxf_write_track_description(pb, &ctx->streams[i]);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
317 return updateSize(pb, pos);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
318 }
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
319
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
320 static int gxf_write_map_packet(ByteIOContext *pb, GXFContext *ctx)
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
321 {
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
322 offset_t pos = url_ftell(pb);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
323
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
324 gxf_write_packet_header(pb, PKT_MAP);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
325
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
326 /* preamble */
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
327 put_byte(pb, 0xE0); /* version */
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
328 put_byte(pb, 0xFF); /* reserved */
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
329
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
330 gxf_write_material_data_section(pb, ctx);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
331 gxf_write_track_description_section(pb, ctx);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
332
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
333 return updatePacketSize(pb, pos);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
334 }
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
335
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
336 #if 0
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
337 static int gxf_write_flt_packet(ByteIOContext *pb, GXFContext *ctx)
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
338 {
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
339 offset_t pos = url_ftell(pb);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
340 int i;
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
341
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
342 gxf_write_packet_header(pb, PKT_FLT);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
343
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
344 put_le32(pb, 1000); /* number of fields */
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
345 put_le32(pb, 0); /* number of active flt entries */
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
346
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
347 for (i = 0; i < 1000; ++i) {
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
348 put_le32(pb, 0);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
349 }
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
350 return updatePacketSize(pb, pos);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
351 }
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
352 #endif
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
353
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
354 static int gxf_write_umf_material_description(ByteIOContext *pb, GXFContext *ctx)
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
355 {
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
356 put_le32(pb, ctx->flags);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
357 put_le32(pb, ctx->nb_frames); /* length of the longest track */
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
358 put_le32(pb, ctx->nb_frames); /* length of the shortest track */
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
359 put_le32(pb, 0); /* mark in */
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
360 put_le32(pb, ctx->nb_frames); /* mark out */
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
361 put_le32(pb, 0); /* timecode mark in */
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
362 put_le32(pb, ctx->nb_frames); /* timecode mark out */
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
363 put_le64(pb, ctx->fc->timestamp); /* modification time */
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
364 put_le64(pb, ctx->fc->timestamp); /* creation time */
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
365 put_le16(pb, 0); /* reserved */
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
366 put_le16(pb, 0); /* reserved */
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
367 put_le16(pb, ctx->audio_tracks);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
368 put_le16(pb, 0); /* timecode track count */
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
369 put_le16(pb, 0); /* reserved */
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
370 put_le16(pb, ctx->mpeg_tracks);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
371 return 48;
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
372 }
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
373
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
374 static int gxf_write_umf_payload(ByteIOContext *pb, GXFContext *ctx)
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
375 {
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
376 put_le32(pb, ctx->umf_length); /* total length of the umf data */
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
377 put_le32(pb, 3); /* version */
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
378 put_le32(pb, ctx->fc->nb_streams);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
379 put_le32(pb, ctx->umf_track_offset); /* umf track section offset */
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
380 put_le32(pb, ctx->umf_track_size);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
381 put_le32(pb, ctx->fc->nb_streams);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
382 put_le32(pb, ctx->umf_media_offset);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
383 put_le32(pb, ctx->umf_media_size);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
384 put_le32(pb, ctx->umf_user_data_offset); /* user data offset */
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
385 put_le32(pb, ctx->umf_user_data_size); /* user data size */
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
386 put_le32(pb, 0); /* reserved */
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
387 put_le32(pb, 0); /* reserved */
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
388 return 48;
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
389 }
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
390
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
391 static int gxf_write_umf_track_description(ByteIOContext *pb, GXFContext *ctx)
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
392 {
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
393 offset_t pos = url_ftell(pb);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
394 int tracks[255]={0};
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
395 int i;
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
396
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
397 ctx->umf_track_offset = pos - ctx->umf_start_offset;
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
398 for (i = 0; i < ctx->fc->nb_streams; ++i) {
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
399 AVStream *st = ctx->fc->streams[i];
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
400 GXFStreamContext *sc = &ctx->streams[i];
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
401 int id = 0;
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
402
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
403 switch (st->codec->codec_id) {
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
404 case CODEC_ID_MPEG1VIDEO: id= 'L'; break;
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
405 case CODEC_ID_MPEG2VIDEO: id= 'M'; break;
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
406 case CODEC_ID_PCM_S16LE: id= 'A'; break;
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
407 case CODEC_ID_DVVIDEO: id= sc->track_type == 6 ? 'E' : 'D'; break;
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
408 case CODEC_ID_MJPEG: id= 'V'; break;
1361
37baab7af15a quiet gcc about enum value not handled in switch
bcoudurier
parents: 1358
diff changeset
409 default: break;
1183
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
410 }
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
411 sc->media_info= id << 8;
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
412 /* FIXME first 10 audio tracks are 0 to 9 next 22 are A to V */
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
413 sc->media_info |= '0' + (tracks[id]++);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
414 put_le16(pb, sc->media_info);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
415 put_le16(pb, 1);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
416 }
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
417 return url_ftell(pb) - pos;
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
418 }
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
419
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
420 static int gxf_write_umf_media_mpeg(ByteIOContext *pb, GXFStreamContext *stream)
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
421 {
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
422 if (stream->codec->pix_fmt == PIX_FMT_YUV422P)
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
423 put_le32(pb, 2);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
424 else
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
425 put_le32(pb, 1); /* default to 420 */
1262
8da1b141e83a set correct first gop closed value
bcoudurier
parents: 1261
diff changeset
426 put_le32(pb, stream->first_gop_closed == 1); /* closed = 1, open = 0, unknown = 255 */
1183
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
427 put_le32(pb, 3); /* top = 1, bottom = 2, frame = 3, unknown = 0 */
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
428 put_le32(pb, 1); /* I picture per GOP */
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
429 put_le32(pb, stream->p_per_gop);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
430 put_le32(pb, stream->b_per_gop);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
431 if (stream->codec->codec_id == CODEC_ID_MPEG2VIDEO)
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
432 put_le32(pb, 2);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
433 else if (stream->codec->codec_id == CODEC_ID_MPEG1VIDEO)
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
434 put_le32(pb, 1);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
435 else
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
436 put_le32(pb, 0);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
437 put_le32(pb, 0); /* reserved */
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
438 return 32;
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
439 }
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
440
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
441 static int gxf_write_umf_media_timecode(ByteIOContext *pb, GXFStreamContext *track)
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
442 {
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
443 /* FIXME implement */
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
444 put_be32(pb, 0); /* drop frame flag */
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
445 put_be32(pb, 0); /* reserved */
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
446 put_be32(pb, 0); /* reserved */
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
447 put_be32(pb, 0); /* reserved */
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
448 put_be32(pb, 0); /* reserved */
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
449 put_be32(pb, 0); /* reserved */
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
450 put_be32(pb, 0); /* reserved */
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
451 put_be32(pb, 0); /* reserved */
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
452 return 32;
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
453 }
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
454
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
455 static int gxf_write_umf_media_dv(ByteIOContext *pb, GXFStreamContext *track)
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
456 {
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
457 int i;
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
458
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
459 for (i = 0; i < 8; i++) {
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
460 put_be32(pb, 0);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
461 }
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
462 return 32;
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
463 }
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
464
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
465 static int gxf_write_umf_media_audio(ByteIOContext *pb, GXFStreamContext *track)
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
466 {
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
467 put_le64(pb, av_dbl2int(1)); /* sound level to begin to */
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
468 put_le64(pb, av_dbl2int(1)); /* sound level to begin to */
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
469 put_le32(pb, 0); /* number of fields over which to ramp up sound level */
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
470 put_le32(pb, 0); /* number of fields over which to ramp down sound level */
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
471 put_le32(pb, 0); /* reserved */
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
472 put_le32(pb, 0); /* reserved */
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
473 return 32;
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
474 }
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
475
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
476 #if 0
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
477 static int gxf_write_umf_media_mjpeg(ByteIOContext *pb, GXFStreamContext *track)
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
478 {
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
479 put_be64(pb, 0); /* FIXME FLOAT max chroma quant level */
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
480 put_be64(pb, 0); /* FIXME FLOAT max luma quant level */
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
481 put_be64(pb, 0); /* FIXME FLOAT min chroma quant level */
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
482 put_be64(pb, 0); /* FIXME FLOAT min luma quant level */
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
483 return 32;
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
484 }
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
485 #endif
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
486
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
487 static int gxf_write_umf_media_description(ByteIOContext *pb, GXFContext *ctx)
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
488 {
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
489 offset_t pos;
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
490 int i;
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
491
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
492 pos = url_ftell(pb);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
493 ctx->umf_media_offset = pos - ctx->umf_start_offset;
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
494 for (i = 0; i < ctx->fc->nb_streams; ++i) {
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
495 GXFStreamContext *sc = &ctx->streams[i];
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
496 char buffer[88];
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
497 offset_t startpos, curpos;
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
498 int path_size = strlen(ES_NAME_PATTERN);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
499
1260
ac77a4dc27dd init buffer
bcoudurier
parents: 1253
diff changeset
500 memset(buffer, 0, 88);
1183
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
501 startpos = url_ftell(pb);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
502 put_le16(pb, 0); /* length */
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
503 put_le16(pb, sc->media_info);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
504 put_le16(pb, 0); /* reserved */
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
505 put_le16(pb, 0); /* reserved */
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
506 put_le32(pb, ctx->nb_frames);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
507 put_le32(pb, 0); /* attributes rw, ro */
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
508 put_le32(pb, 0); /* mark in */
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
509 put_le32(pb, ctx->nb_frames); /* mark out */
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
510 strncpy(buffer, ES_NAME_PATTERN, path_size);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
511 put_buffer(pb, (uint8_t *)buffer, path_size);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
512 put_be16(pb, sc->media_info);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
513 put_buffer(pb, (uint8_t *)buffer + path_size + 2, 88 - path_size - 2);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
514 put_le32(pb, sc->track_type);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
515 put_le32(pb, sc->sample_rate);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
516 put_le32(pb, sc->sample_size);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
517 put_le32(pb, 0); /* reserved */
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
518 switch (sc->codec->codec_id) {
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
519 case CODEC_ID_MPEG2VIDEO:
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
520 gxf_write_umf_media_mpeg(pb, sc);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
521 break;
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
522 case CODEC_ID_PCM_S16LE:
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
523 gxf_write_umf_media_audio(pb, sc);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
524 break;
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
525 case CODEC_ID_DVVIDEO:
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
526 gxf_write_umf_media_dv(pb, sc);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
527 break;
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
528 default:
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
529 gxf_write_umf_media_timecode(pb, sc); /* 8 0bytes */
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
530 }
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
531 curpos = url_ftell(pb);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
532 url_fseek(pb, startpos, SEEK_SET);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
533 put_le16(pb, curpos - startpos);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
534 url_fseek(pb, curpos, SEEK_SET);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
535 }
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
536 return url_ftell(pb) - pos;
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
537 }
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
538
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
539 static int gxf_write_umf_user_data(ByteIOContext *pb, GXFContext *ctx)
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
540 {
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
541 offset_t pos = url_ftell(pb);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
542 ctx->umf_user_data_offset = pos - ctx->umf_start_offset;
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
543 put_le32(pb, 20);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
544 put_le32(pb, 0);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
545 put_le16(pb, 0);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
546 put_le16(pb, 0);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
547 put_le32(pb, 0);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
548 put_byte(pb, 0);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
549 put_byte(pb, 0);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
550 put_byte(pb, 0);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
551 put_byte(pb, 0);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
552 return 20;
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
553 }
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
554
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
555 static int gxf_write_umf_packet(ByteIOContext *pb, GXFContext *ctx)
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
556 {
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
557 offset_t pos = url_ftell(pb);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
558
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
559 gxf_write_packet_header(pb, PKT_UMF);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
560
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
561 /* preamble */
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
562 put_byte(pb, 3); /* first and last (only) packet */
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
563 put_be32(pb, ctx->umf_length); /* data length */
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
564
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
565 ctx->umf_start_offset = url_ftell(pb);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
566 gxf_write_umf_payload(pb, ctx);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
567 gxf_write_umf_material_description(pb, ctx);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
568 ctx->umf_track_size = gxf_write_umf_track_description(pb, ctx);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
569 ctx->umf_media_size = gxf_write_umf_media_description(pb, ctx);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
570 ctx->umf_user_data_size = gxf_write_umf_user_data(pb, ctx);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
571 ctx->umf_length = url_ftell(pb) - ctx->umf_start_offset;
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
572 return updatePacketSize(pb, pos);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
573 }
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
574
1794
11c57b75bccd fix dts adjusting
bcoudurier
parents: 1698
diff changeset
575 #define GXF_NODELAY -5000
11c57b75bccd fix dts adjusting
bcoudurier
parents: 1698
diff changeset
576
1183
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
577 static int gxf_write_header(AVFormatContext *s)
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
578 {
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
579 ByteIOContext *pb = &s->pb;
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
580 GXFContext *gxf = s->priv_data;
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
581 int i;
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
582
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
583 gxf->fc = s;
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
584 gxf->flags |= 0x00080000; /* material is simple clip */
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
585 for (i = 0; i < s->nb_streams; ++i) {
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
586 AVStream *st = s->streams[i];
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
587 GXFStreamContext *sc = &gxf->streams[i];
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
588
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
589 sc->codec = st->codec;
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
590 sc->index = i;
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
591 sc->media_type = codec_get_tag(gxf_media_types, sc->codec->codec_id);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
592 if (st->codec->codec_type == CODEC_TYPE_AUDIO) {
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
593 if (st->codec->codec_id != CODEC_ID_PCM_S16LE) {
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
594 av_log(s, AV_LOG_ERROR, "only 16 BIT PCM LE allowed for now\n");
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
595 return -1;
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
596 }
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
597 if (st->codec->sample_rate != 48000) {
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
598 av_log(s, AV_LOG_ERROR, "only 48000hz sampling rate is allowed\n");
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
599 return -1;
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
600 }
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
601 if (st->codec->channels != 1) {
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
602 av_log(s, AV_LOG_ERROR, "only mono tracks are allowed\n");
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
603 return -1;
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
604 }
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
605 sc->track_type = 2;
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
606 sc->sample_rate = st->codec->sample_rate;
1253
f3d5e1c49875 use packet dts as correct media field number and use av_interleave_pkt_per_dts
bcoudurier
parents: 1247
diff changeset
607 av_set_pts_info(st, 64, 1, sc->sample_rate);
1183
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
608 sc->sample_size = 16;
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
609 sc->frame_rate_index = -2;
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
610 sc->lines_index = -2;
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
611 sc->fields = -2;
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
612 gxf->audio_tracks++;
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
613 gxf->flags |= 0x04000000; /* audio is 16 bit pcm */
1322
95f56c7b24eb * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents: 1262
diff changeset
614 av_fifo_init(&sc->audio_buffer, 3*GXF_AUDIO_PACKET_SIZE);
1183
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
615 } else if (sc->codec->codec_type == CODEC_TYPE_VIDEO) {
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
616 /* FIXME check from time_base ? */
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
617 if (sc->codec->height == 480 || sc->codec->height == 512) { /* NTSC or NTSC+VBI */
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
618 sc->frame_rate_index = 5;
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
619 sc->sample_rate = 60;
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
620 gxf->flags |= 0x00000080;
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
621 } else { /* assume PAL */
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
622 sc->frame_rate_index = 6;
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
623 sc->media_type++;
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
624 sc->sample_rate = 50;
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
625 gxf->flags |= 0x00000040;
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
626 }
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
627 gxf->sample_rate = sc->sample_rate;
1794
11c57b75bccd fix dts adjusting
bcoudurier
parents: 1698
diff changeset
628 av_set_pts_info(st, 64, 1, st->codec->time_base.den);
11c57b75bccd fix dts adjusting
bcoudurier
parents: 1698
diff changeset
629 sc->dts_delay = GXF_NODELAY;
1183
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
630 if (gxf_find_lines_index(sc) < 0)
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
631 sc->lines_index = -1;
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
632 sc->sample_size = st->codec->bit_rate;
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
633 sc->fields = 2; /* interlaced */
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
634 switch (sc->codec->codec_id) {
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
635 case CODEC_ID_MPEG2VIDEO:
1262
8da1b141e83a set correct first gop closed value
bcoudurier
parents: 1261
diff changeset
636 sc->first_gop_closed = -1;
1183
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
637 sc->track_type = 4;
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
638 gxf->mpeg_tracks++;
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
639 gxf->flags |= 0x00008000;
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
640 break;
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
641 case CODEC_ID_DVVIDEO:
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
642 if (sc->codec->pix_fmt == PIX_FMT_YUV422P) {
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
643 sc->media_type += 2;
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
644 sc->track_type = 6;
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
645 gxf->flags |= 0x00002000;
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
646 } else {
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
647 sc->track_type = 5;
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
648 gxf->flags |= 0x00001000;
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
649 }
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
650 break;
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
651 default:
1401
e4a89160a011 use AVFormatContext to log
bcoudurier
parents: 1398
diff changeset
652 av_log(s, AV_LOG_ERROR, "video codec not supported\n");
1183
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
653 return -1;
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
654 }
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
655 }
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
656 }
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
657 gxf_write_map_packet(pb, gxf);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
658 //gxf_write_flt_packet(pb, gxf);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
659 gxf_write_umf_packet(pb, gxf);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
660 put_flush_packet(pb);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
661 return 0;
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
662 }
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
663
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
664 static int gxf_write_eos_packet(ByteIOContext *pb, GXFContext *ctx)
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
665 {
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
666 offset_t pos = url_ftell(pb);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
667
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
668 gxf_write_packet_header(pb, PKT_EOS);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
669 return updatePacketSize(pb, pos);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
670 }
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
671
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
672 static int gxf_write_trailer(AVFormatContext *s)
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
673 {
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
674 ByteIOContext *pb = &s->pb;
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
675 GXFContext *gxf = s->priv_data;
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
676 offset_t end;
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
677 int i;
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
678
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
679 for (i = 0; i < s->nb_streams; ++i) {
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
680 if (s->streams[i]->codec->codec_type == CODEC_TYPE_AUDIO) {
1322
95f56c7b24eb * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents: 1262
diff changeset
681 av_fifo_free(&gxf->streams[i].audio_buffer);
1183
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
682 }
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
683 if (s->streams[i]->codec->frame_number > gxf->nb_frames)
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
684 gxf->nb_frames = 2 * s->streams[i]->codec->frame_number;
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
685 }
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
686
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
687 gxf_write_eos_packet(pb, gxf);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
688 end = url_ftell(pb);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
689 url_fseek(pb, 0, SEEK_SET);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
690 /* overwrite map and umf packets with new values */
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
691 gxf_write_map_packet(pb, gxf);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
692 //gxf_write_flt_packet(pb, gxf);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
693 gxf_write_umf_packet(pb, gxf);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
694 url_fseek(pb, end, SEEK_SET);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
695 return 0;
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
696 }
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
697
1247
2f118b3e65c6 parse mpeg frame to get pict type and closed gop flag
bcoudurier
parents: 1213
diff changeset
698 static int gxf_parse_mpeg_frame(GXFStreamContext *sc, const uint8_t *buf, int size)
2f118b3e65c6 parse mpeg frame to get pict type and closed gop flag
bcoudurier
parents: 1213
diff changeset
699 {
2f118b3e65c6 parse mpeg frame to get pict type and closed gop flag
bcoudurier
parents: 1213
diff changeset
700 uint32_t c=-1;
2f118b3e65c6 parse mpeg frame to get pict type and closed gop flag
bcoudurier
parents: 1213
diff changeset
701 int i;
2f118b3e65c6 parse mpeg frame to get pict type and closed gop flag
bcoudurier
parents: 1213
diff changeset
702 for(i=0; i<size-4 && c!=0x100; i++){
2f118b3e65c6 parse mpeg frame to get pict type and closed gop flag
bcoudurier
parents: 1213
diff changeset
703 c = (c<<8) + buf[i];
1262
8da1b141e83a set correct first gop closed value
bcoudurier
parents: 1261
diff changeset
704 if(c == 0x1B8 && sc->first_gop_closed == -1) /* GOP start code */
1261
e03e8ce942e8 rename closed_gop to first_gop_closed
bcoudurier
parents: 1260
diff changeset
705 sc->first_gop_closed= (buf[i+4]>>6)&1;
1247
2f118b3e65c6 parse mpeg frame to get pict type and closed gop flag
bcoudurier
parents: 1213
diff changeset
706 }
2f118b3e65c6 parse mpeg frame to get pict type and closed gop flag
bcoudurier
parents: 1213
diff changeset
707 return (buf[i+1]>>3)&7;
2f118b3e65c6 parse mpeg frame to get pict type and closed gop flag
bcoudurier
parents: 1213
diff changeset
708 }
2f118b3e65c6 parse mpeg frame to get pict type and closed gop flag
bcoudurier
parents: 1213
diff changeset
709
1183
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
710 static int gxf_write_media_preamble(ByteIOContext *pb, GXFContext *ctx, AVPacket *pkt, int size)
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
711 {
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
712 GXFStreamContext *sc = &ctx->streams[pkt->stream_index];
1794
11c57b75bccd fix dts adjusting
bcoudurier
parents: 1698
diff changeset
713 int64_t dts = av_rescale(pkt->dts, ctx->sample_rate, sc->codec->time_base.den);
1183
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
714
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
715 put_byte(pb, sc->media_type);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
716 put_byte(pb, sc->index);
1253
f3d5e1c49875 use packet dts as correct media field number and use av_interleave_pkt_per_dts
bcoudurier
parents: 1247
diff changeset
717 put_be32(pb, dts);
1183
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
718 if (sc->codec->codec_type == CODEC_TYPE_AUDIO) {
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
719 put_be16(pb, 0);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
720 put_be16(pb, size / 2);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
721 } else if (sc->codec->codec_id == CODEC_ID_MPEG2VIDEO) {
1247
2f118b3e65c6 parse mpeg frame to get pict type and closed gop flag
bcoudurier
parents: 1213
diff changeset
722 int frame_type = gxf_parse_mpeg_frame(sc, pkt->data, pkt->size);
2f118b3e65c6 parse mpeg frame to get pict type and closed gop flag
bcoudurier
parents: 1213
diff changeset
723 if (frame_type == FF_I_TYPE) {
1183
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
724 put_byte(pb, 0x0d);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
725 sc->iframes++;
1247
2f118b3e65c6 parse mpeg frame to get pict type and closed gop flag
bcoudurier
parents: 1213
diff changeset
726 } else if (frame_type == FF_B_TYPE) {
1183
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
727 put_byte(pb, 0x0f);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
728 sc->bframes++;
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
729 } else {
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
730 put_byte(pb, 0x0e);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
731 sc->pframes++;
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
732 }
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
733 put_be24(pb, size);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
734 } else if (sc->codec->codec_id == CODEC_ID_DVVIDEO) {
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
735 put_byte(pb, size / 4096);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
736 put_be24(pb, 0);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
737 } else
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
738 put_be32(pb, size);
1253
f3d5e1c49875 use packet dts as correct media field number and use av_interleave_pkt_per_dts
bcoudurier
parents: 1247
diff changeset
739 put_be32(pb, dts);
1183
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
740 put_byte(pb, 1); /* flags */
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
741 put_byte(pb, 0); /* reserved */
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
742 return 16;
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
743 }
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
744
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
745 static int gxf_write_media_packet(ByteIOContext *pb, GXFContext *ctx, AVPacket *pkt)
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
746 {
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
747 GXFStreamContext *sc = &ctx->streams[pkt->stream_index];
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
748 offset_t pos = url_ftell(pb);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
749 int padding = 0;
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
750
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
751 gxf_write_packet_header(pb, PKT_MEDIA);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
752 if (sc->codec->codec_id == CODEC_ID_MPEG2VIDEO && pkt->size % 4) /* MPEG-2 frames must be padded */
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
753 padding = 4 - pkt->size % 4;
1212
b4f48eb1f411 avoid reading beyond packet size
bcoudurier
parents: 1183
diff changeset
754 else if (sc->codec->codec_type == CODEC_TYPE_AUDIO)
b4f48eb1f411 avoid reading beyond packet size
bcoudurier
parents: 1183
diff changeset
755 padding = GXF_AUDIO_PACKET_SIZE - pkt->size;
1183
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
756 gxf_write_media_preamble(pb, ctx, pkt, pkt->size + padding);
1212
b4f48eb1f411 avoid reading beyond packet size
bcoudurier
parents: 1183
diff changeset
757 put_buffer(pb, pkt->data, pkt->size);
b4f48eb1f411 avoid reading beyond packet size
bcoudurier
parents: 1183
diff changeset
758 gxf_write_padding(pb, padding);
1183
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
759 return updatePacketSize(pb, pos);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
760 }
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
761
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
762 static int gxf_write_packet(AVFormatContext *s, AVPacket *pkt)
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
763 {
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
764 GXFContext *gxf = s->priv_data;
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
765
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
766 gxf_write_media_packet(&s->pb, gxf, pkt);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
767 put_flush_packet(&s->pb);
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
768 return 0;
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
769 }
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
770
1253
f3d5e1c49875 use packet dts as correct media field number and use av_interleave_pkt_per_dts
bcoudurier
parents: 1247
diff changeset
771 static int gxf_new_audio_packet(GXFContext *gxf, GXFStreamContext *sc, AVPacket *pkt, int flush)
f3d5e1c49875 use packet dts as correct media field number and use av_interleave_pkt_per_dts
bcoudurier
parents: 1247
diff changeset
772 {
1322
95f56c7b24eb * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents: 1262
diff changeset
773 int size = flush ? av_fifo_size(&sc->audio_buffer) : GXF_AUDIO_PACKET_SIZE;
1253
f3d5e1c49875 use packet dts as correct media field number and use av_interleave_pkt_per_dts
bcoudurier
parents: 1247
diff changeset
774
f3d5e1c49875 use packet dts as correct media field number and use av_interleave_pkt_per_dts
bcoudurier
parents: 1247
diff changeset
775 if (!size)
f3d5e1c49875 use packet dts as correct media field number and use av_interleave_pkt_per_dts
bcoudurier
parents: 1247
diff changeset
776 return 0;
f3d5e1c49875 use packet dts as correct media field number and use av_interleave_pkt_per_dts
bcoudurier
parents: 1247
diff changeset
777 av_new_packet(pkt, size);
1322
95f56c7b24eb * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents: 1262
diff changeset
778 av_fifo_read(&sc->audio_buffer, pkt->data, size);
1253
f3d5e1c49875 use packet dts as correct media field number and use av_interleave_pkt_per_dts
bcoudurier
parents: 1247
diff changeset
779 pkt->stream_index = sc->index;
f3d5e1c49875 use packet dts as correct media field number and use av_interleave_pkt_per_dts
bcoudurier
parents: 1247
diff changeset
780 pkt->dts = sc->current_dts;
f3d5e1c49875 use packet dts as correct media field number and use av_interleave_pkt_per_dts
bcoudurier
parents: 1247
diff changeset
781 sc->current_dts += size / 2; /* we only support 16 bit pcm mono for now */
f3d5e1c49875 use packet dts as correct media field number and use av_interleave_pkt_per_dts
bcoudurier
parents: 1247
diff changeset
782 return size;
f3d5e1c49875 use packet dts as correct media field number and use av_interleave_pkt_per_dts
bcoudurier
parents: 1247
diff changeset
783 }
f3d5e1c49875 use packet dts as correct media field number and use av_interleave_pkt_per_dts
bcoudurier
parents: 1247
diff changeset
784
1183
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
785 static int gxf_interleave_packet(AVFormatContext *s, AVPacket *out, AVPacket *pkt, int flush)
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
786 {
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
787 GXFContext *gxf = s->priv_data;
1253
f3d5e1c49875 use packet dts as correct media field number and use av_interleave_pkt_per_dts
bcoudurier
parents: 1247
diff changeset
788 AVPacket new_pkt;
1183
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
789 int i;
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
790
1253
f3d5e1c49875 use packet dts as correct media field number and use av_interleave_pkt_per_dts
bcoudurier
parents: 1247
diff changeset
791 for (i = 0; i < s->nb_streams; i++) {
1542
98ef8d631737 readjust dts if negative
bcoudurier
parents: 1401
diff changeset
792 AVStream *st = s->streams[i];
98ef8d631737 readjust dts if negative
bcoudurier
parents: 1401
diff changeset
793 GXFStreamContext *sc = &gxf->streams[i];
98ef8d631737 readjust dts if negative
bcoudurier
parents: 1401
diff changeset
794 if (st->codec->codec_type == CODEC_TYPE_AUDIO) {
1253
f3d5e1c49875 use packet dts as correct media field number and use av_interleave_pkt_per_dts
bcoudurier
parents: 1247
diff changeset
795 if (pkt && pkt->stream_index == i) {
1322
95f56c7b24eb * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents: 1262
diff changeset
796 av_fifo_write(&sc->audio_buffer, pkt->data, pkt->size);
1253
f3d5e1c49875 use packet dts as correct media field number and use av_interleave_pkt_per_dts
bcoudurier
parents: 1247
diff changeset
797 pkt = NULL;
1183
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
798 }
1322
95f56c7b24eb * Moving FifoBuffer out of libavformat/avformat.h and
romansh
parents: 1262
diff changeset
799 if (flush || av_fifo_size(&sc->audio_buffer) >= GXF_AUDIO_PACKET_SIZE) {
1398
303e9fb547c7 avoid overwriting pkt
bcoudurier
parents: 1361
diff changeset
800 if (!pkt && gxf_new_audio_packet(gxf, sc, &new_pkt, flush) > 0) {
1253
f3d5e1c49875 use packet dts as correct media field number and use av_interleave_pkt_per_dts
bcoudurier
parents: 1247
diff changeset
801 pkt = &new_pkt;
f3d5e1c49875 use packet dts as correct media field number and use av_interleave_pkt_per_dts
bcoudurier
parents: 1247
diff changeset
802 break; /* add pkt right now into list */
f3d5e1c49875 use packet dts as correct media field number and use av_interleave_pkt_per_dts
bcoudurier
parents: 1247
diff changeset
803 }
1183
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
804 }
1794
11c57b75bccd fix dts adjusting
bcoudurier
parents: 1698
diff changeset
805 } else if (pkt && pkt->stream_index == i) {
11c57b75bccd fix dts adjusting
bcoudurier
parents: 1698
diff changeset
806 if (sc->dts_delay == GXF_NODELAY) /* adjust dts if needed */
11c57b75bccd fix dts adjusting
bcoudurier
parents: 1698
diff changeset
807 sc->dts_delay = pkt->dts;
1542
98ef8d631737 readjust dts if negative
bcoudurier
parents: 1401
diff changeset
808 pkt->dts -= sc->dts_delay;
1183
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
809 }
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
810 }
1253
f3d5e1c49875 use packet dts as correct media field number and use av_interleave_pkt_per_dts
bcoudurier
parents: 1247
diff changeset
811 return av_interleave_packet_per_dts(s, out, pkt, flush);
1183
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
812 }
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
813
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
814 AVOutputFormat gxf_muxer = {
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
815 "gxf",
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
816 "GXF format",
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
817 NULL,
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
818 "gxf",
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
819 sizeof(GXFContext),
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
820 CODEC_ID_PCM_S16LE,
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
821 CODEC_ID_MPEG2VIDEO,
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
822 gxf_write_header,
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
823 gxf_write_packet,
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
824 gxf_write_trailer,
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
825 0,
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
826 NULL,
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
827 gxf_interleave_packet,
5b04d98e11bb GXF muxer
bcoudurier
parents:
diff changeset
828 };