annotate libmpdemux/muxer_mpeg.c @ 31090:1aece15222b5

Remove internal liba52 copy. Nowadays FFmpeg is faster than liba52 and external liba52 is well supported.
author diego
date Sun, 09 May 2010 14:45:29 +0000
parents 459227551819
children 9318ad289bb0
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
29238
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 29222
diff changeset
1 /*
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 29222
diff changeset
2 * This file is part of MPlayer.
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 29222
diff changeset
3 *
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 29222
diff changeset
4 * MPlayer is free software; you can redistribute it and/or modify
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 29222
diff changeset
5 * it under the terms of the GNU General Public License as published by
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 29222
diff changeset
6 * the Free Software Foundation; either version 2 of the License, or
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 29222
diff changeset
7 * (at your option) any later version.
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 29222
diff changeset
8 *
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 29222
diff changeset
9 * MPlayer is distributed in the hope that it will be useful,
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 29222
diff changeset
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 29222
diff changeset
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 29222
diff changeset
12 * GNU General Public License for more details.
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 29222
diff changeset
13 *
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 29222
diff changeset
14 * You should have received a copy of the GNU General Public License along
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 29222
diff changeset
15 * with MPlayer; if not, write to the Free Software Foundation, Inc.,
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 29222
diff changeset
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 29222
diff changeset
17 */
8585
27da710563c2 the long-waited MUXER layer, and new MPEG-PS muxer
arpi
parents:
diff changeset
18
27da710563c2 the long-waited MUXER layer, and new MPEG-PS muxer
arpi
parents:
diff changeset
19 #include <stdio.h>
27da710563c2 the long-waited MUXER layer, and new MPEG-PS muxer
arpi
parents:
diff changeset
20 #include <stdlib.h>
23637
df9aa9eb9de6 Use proper PRI?64 format strings
reimar
parents: 22929
diff changeset
21 #include <inttypes.h>
8585
27da710563c2 the long-waited MUXER layer, and new MPEG-PS muxer
arpi
parents:
diff changeset
22 #include <string.h>
27da710563c2 the long-waited MUXER layer, and new MPEG-PS muxer
arpi
parents:
diff changeset
23 #include <sys/types.h>
27da710563c2 the long-waited MUXER layer, and new MPEG-PS muxer
arpi
parents:
diff changeset
24
27da710563c2 the long-waited MUXER layer, and new MPEG-PS muxer
arpi
parents:
diff changeset
25 #include "config.h"
17012
6ff3379a0862 Unify include path handling, -I.. is in CFLAGS.
diego
parents: 16750
diff changeset
26 #include "mp_msg.h"
17065
cf6bfdf41143 Clean up some muxer messages, patch by Corey Hickey bugfood-ml AT -fatooh/org- , small fixes by me
reynaldo
parents: 17023
diff changeset
27 #include "help_mp.h"
8585
27da710563c2 the long-waited MUXER layer, and new MPEG-PS muxer
arpi
parents:
diff changeset
28
12341
0db4a3a5b01d removed loader/ dependancy, imported some files from g2, also used patches from Dominik Mierzejewski
alex
parents: 11223
diff changeset
29 #include "aviheader.h"
0db4a3a5b01d removed loader/ dependancy, imported some files from g2, also used patches from Dominik Mierzejewski
alex
parents: 11223
diff changeset
30 #include "ms_hdr.h"
0db4a3a5b01d removed loader/ dependancy, imported some files from g2, also used patches from Dominik Mierzejewski
alex
parents: 11223
diff changeset
31
22605
4d81dbdf46b9 Add explicit location for headers from the stream/ directory.
diego
parents: 22333
diff changeset
32 #include "stream/stream.h"
8585
27da710563c2 the long-waited MUXER layer, and new MPEG-PS muxer
arpi
parents:
diff changeset
33 #include "muxer.h"
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
34 #include "demuxer.h"
30576
24a5dc9d1466 Add separate header for mp_a52_framesize(); avoids forward declarations.
diego
parents: 30574
diff changeset
35 #include "demux_ts.h"
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
36 #include "stheader.h"
17012
6ff3379a0862 Unify include path handling, -I.. is in CFLAGS.
diego
parents: 16750
diff changeset
37 #include "m_option.h"
30574
928359c13d93 Add separate header for aac_parse_frame(); avoids forward declarations.
diego
parents: 29263
diff changeset
38 #include "aac_hdr.h"
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
39 #include "mpeg_hdr.h"
17091
rathann
parents: 17066
diff changeset
40 #include "mp3_hdr.h"
31089
459227551819 Use the system liba52 headers when internal liba52 is disabled, fixes:
diego
parents: 30958
diff changeset
41
459227551819 Use the system liba52 headers when internal liba52 is disabled, fixes:
diego
parents: 30958
diff changeset
42 #ifdef CONFIG_LIBA52
459227551819 Use the system liba52 headers when internal liba52 is disabled, fixes:
diego
parents: 30958
diff changeset
43 #include <a52dec/a52.h>
459227551819 Use the system liba52 headers when internal liba52 is disabled, fixes:
diego
parents: 30958
diff changeset
44 #endif
8585
27da710563c2 the long-waited MUXER layer, and new MPEG-PS muxer
arpi
parents:
diff changeset
45
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
46 #define PACK_HEADER_START_CODE 0x01ba
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
47 #define SYSTEM_HEADER_START_CODE 0x01bb
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
48 #define PSM_START_CODE 0x01bc
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
49
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
50 #define PES_PRIVATE1 0x01bd
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
51 #define PES_PRIVATE2 0x01bf
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
52
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
53 #define MUX_MPEG1 1
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
54 #define MUX_MPEG2 2
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
55
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
56 #define VIDEO_MPEG1 0x10000001
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
57 #define VIDEO_MPEG2 0x10000002
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
58 #define AUDIO_MP2 0x50
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
59 #define AUDIO_MP3 0x55
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
60 #define AUDIO_A52 0x2000
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
61 #define AUDIO_LPCM 0x10001 /* only a placeholder at the moment */
15278
a45c7e1b998f added support for AAC; moved most of MSGL_V to MSGL_DBG2 to reduce verbosity
nicodvb
parents: 15083
diff changeset
62 #define AUDIO_AAC1 0x706D
a45c7e1b998f added support for AAC; moved most of MSGL_V to MSGL_DBG2 to reduce verbosity
nicodvb
parents: 15083
diff changeset
63 //#define AUDIO_AAC2 (short) mmioFOURCC('m','p','4','a')
a45c7e1b998f added support for AAC; moved most of MSGL_V to MSGL_DBG2 to reduce verbosity
nicodvb
parents: 15083
diff changeset
64 #define AUDIO_AAC2 0x504D
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
65
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
66 #define ASPECT_1_1 1
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
67 #define ASPECT_4_3 2
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
68 #define ASPECT_16_9 3
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
69 #define ASPECT_2_21_1 4
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
70
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
71 #define FRAMERATE_23976 1
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
72 #define FRAMERATE_24 2
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
73 #define FRAMERATE_25 3
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
74 #define FRAMERATE_2997 4
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
75 #define FRAMERATE_30 5
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
76 #define FRAMERATE_50 6
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
77 #define FRAMERATE_5994 7
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
78 #define FRAMERATE_60 8
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
79
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
80 static char ftypes[] = {'?', 'I', 'P', 'B'};
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
81 #define FTYPE(x) (ftypes[(x)])
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
82
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
83 static const char *framerates[] = {
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
84 "unchanged", "23.976", "24", "25", "29.97", "30", "50", "59.94", "60"
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
85 };
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
86
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
87 static const char *aspect_ratios[] = {
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
88 "unchanged", "1/1", "4/3", "16/9", "2.21/1"
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
89 };
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
90
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
91 static char *conf_mux = "mpeg2";
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
92 static uint16_t conf_packet_size = 0; //dvd
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
93 static uint32_t conf_muxrate = 0; //kb/s
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
94 static float conf_vaspect = 0;
14914
8511347a0475 converted vframerate to CONF_TYPE_FLOAT
nicodvb
parents: 14894
diff changeset
95 static float conf_vframerate = 0;
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
96 static uint32_t conf_vwidth = 0, conf_vheight = 0, conf_panscan_width = 0, conf_panscan_height = 0;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
97 static uint32_t conf_vbitrate = 0;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
98 static int conf_init_vpts = 200, conf_init_apts = 200;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
99 static int conf_ts_allframes = 0;
22881
2d01760be338 removed init_apts and init_vpts; added :adelay in addition to :vdelay
nicodvb
parents: 22879
diff changeset
100 static int conf_init_adelay = 0, conf_init_vdelay = 0;
21413
06d63614eeaa permit to specify the sizes of the decoders' buffers
nicodvb
parents: 21372
diff changeset
101 static int conf_abuf_size = 0;
06d63614eeaa permit to specify the sizes of the decoders' buffers
nicodvb
parents: 21372
diff changeset
102 static int conf_vbuf_size = 0;
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
103 static int conf_drop = 0;
14840
d49482c5d8ac soft telecine support! :)) patch by nico
rfelker
parents: 14809
diff changeset
104 static int conf_telecine = 0;
22929
a60dbae6ee1d added :interleaving2, a better method to determine which stream whouls be flushed
nicodvb
parents: 22927
diff changeset
105 static int conf_interleaving2 = 0;
21467
dd765bcd83aa added generalized teleciner by Donald Graft
nicodvb
parents: 21448
diff changeset
106 static float conf_telecine_src = 0;
dd765bcd83aa added generalized teleciner by Donald Graft
nicodvb
parents: 21448
diff changeset
107 static float conf_telecine_dest = 0;
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
108
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
109 enum FRAME_TYPE {
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
110 I_FRAME = 1,
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
111 P_FRAME = 2,
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
112 B_FRAME = 3
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
113 };
8585
27da710563c2 the long-waited MUXER layer, and new MPEG-PS muxer
arpi
parents:
diff changeset
114
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
115 typedef struct {
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
116 uint8_t *buffer;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
117 size_t size;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
118 size_t alloc_size;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
119 uint8_t type;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
120 uint64_t pts, dts, idur;
15947
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
121 uint32_t pos; //start offset for the frame
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
122 } mpeg_frame_t;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
123
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
124 typedef struct {
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
125 uint8_t cnt; // how many entries we use
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
126 struct {
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
127 uint8_t id, type;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
128 uint32_t bufsize;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
129 uint32_t format;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
130 } streams[50]; //16 video + 16 audio mpa + 16 audio private + bd/bf for dvd
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
131 } sys_info_t;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
132
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
133 typedef struct {
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
134 uint8_t cnt; // how many entries we use
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
135 struct {
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
136 uint8_t id;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
137 uint8_t type;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
138 uint32_t format;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
139 } streams[50]; //16 video + 16 audio mpa + 16 audio private + bd/bf for dvd
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
140 } psm_info_t;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
141
18183
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
142 typedef struct {
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
143 int size;
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
144 uint64_t dts;
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
145 } buffer_track_t;
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
146
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
147 typedef struct {
18745
19cd9e0f8ac4 prevent buffer overflow in the STD; simplified fill_packet() (moving part of the code to get_packet_stats())
nicodvb
parents: 18558
diff changeset
148 uint64_t dts, pts;
19cd9e0f8ac4 prevent buffer overflow in the STD; simplified fill_packet() (moving part of the code to get_packet_stats())
nicodvb
parents: 18558
diff changeset
149 uint64_t frame_dts, frame_pts;
19cd9e0f8ac4 prevent buffer overflow in the STD; simplified fill_packet() (moving part of the code to get_packet_stats())
nicodvb
parents: 18558
diff changeset
150 int len, stflen;
19cd9e0f8ac4 prevent buffer overflow in the STD; simplified fill_packet() (moving part of the code to get_packet_stats())
nicodvb
parents: 18558
diff changeset
151 } pack_stats_t;
19cd9e0f8ac4 prevent buffer overflow in the STD; simplified fill_packet() (moving part of the code to get_packet_stats())
nicodvb
parents: 18558
diff changeset
152
19cd9e0f8ac4 prevent buffer overflow in the STD; simplified fill_packet() (moving part of the code to get_packet_stats())
nicodvb
parents: 18558
diff changeset
153 typedef struct {
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
154 int mux;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
155 sys_info_t sys_info;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
156 psm_info_t psm_info;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
157 uint16_t packet_size;
21141
33cce0f7e66c permit muxing to raw pes (VDR uses this)
nicodvb
parents: 20344
diff changeset
158 int is_dvd, is_xvcd, is_xsvcd, is_genmpeg1, is_genmpeg2, rawpes, ts_allframes, has_video, has_audio;
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
159 int update_system_header, use_psm;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
160 off_t headers_size, data_size;
18200
b8a94743afec removed more unused code and struct members
nicodvb
parents: 18199
diff changeset
161 uint64_t scr;
18183
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
162 uint64_t delta_scr;
24904
75e930e20f48 repeat the PSM once every second (in terms of delta_scr) otherwise playing the file from the middle would miss the first instance
nicodvb
parents: 24903
diff changeset
163 uint64_t last_psm_scr;
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
164 uint32_t muxrate;
18200
b8a94743afec removed more unused code and struct members
nicodvb
parents: 18199
diff changeset
165 uint8_t *buff;
17271
9e20b0073d9b simplification: don't use residual_buffer, but prepend remainder of current frame to next one (needed for future work; init frame->pos to 0 in reorder_frame(); fix: don't go beyond last frame in flush_buffer()
nicodvb
parents: 17091
diff changeset
166 uint32_t headers_cnt;
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
167 double init_adelay;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
168 int drop;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
169
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
170 //video patching parameters
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
171 uint8_t vaspect, vframerate;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
172 uint16_t vwidth, vheight, panscan_width, panscan_height;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
173 uint32_t vbitrate;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
174 int patch_seq, patch_sde;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
175 int psm_streams_cnt;
25720
333540254bb4 Put bff_mask into muxer context instead of a global variable.
reimar
parents: 25098
diff changeset
176
333540254bb4 Put bff_mask into muxer context instead of a global variable.
reimar
parents: 25098
diff changeset
177 //2 million frames are enough
333540254bb4 Put bff_mask into muxer context instead of a global variable.
reimar
parents: 25098
diff changeset
178 #define MAX_PATTERN_LENGTH 2000000
333540254bb4 Put bff_mask into muxer context instead of a global variable.
reimar
parents: 25098
diff changeset
179 uint8_t bff_mask[MAX_PATTERN_LENGTH];
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
180 } muxer_priv_t;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
181
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
182
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
183 typedef struct {
24906
e3fec0def910 removed no more needed variable
nicodvb
parents: 24905
diff changeset
184 int has_pts, has_dts, pes_is_aligned, type, min_pes_hlen;
22328
42d21ca22e7e member real_framerate is completely useless
nicodvb
parents: 22323
diff changeset
185 int delay_rff;
18200
b8a94743afec removed more unused code and struct members
nicodvb
parents: 18199
diff changeset
186 uint64_t pts, last_pts, last_dts, dts, size, frame_duration, delta_pts, nom_delta_pts, last_saved_pts;
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
187 uint32_t buffer_size;
18200
b8a94743afec removed more unused code and struct members
nicodvb
parents: 18199
diff changeset
188 double delta_clock, timer;
18181
afaa492536f6 new code to simplify assignment of timestamps; removed temp_ref from mpeg_frame_t and modified add_frame() accordingly; removed no more used drop_delayed_audio() and save_delayed_audio()
nicodvb
parents: 18166
diff changeset
189 int drop_delayed_frames;
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
190 mpeg_frame_t *framebuf;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
191 uint16_t framebuf_cnt;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
192 uint16_t framebuf_used;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
193 int32_t last_tr;
14880
991f5a7b1b7d telecine now works in display order (rather than decoding), as far as there are no more than 4 consecutive b-frames; added support for FMP4
nicodvb
parents: 14840
diff changeset
194 int max_tr;
17301
bbf5438d646a removed previously forgotten reording options/flags
nicodvb
parents: 17298
diff changeset
195 uint8_t id, is_mpeg12, telecine;
14840
d49482c5d8ac soft telecine support! :)) patch by nico
rfelker
parents: 14809
diff changeset
196 uint64_t vframes;
21485
2d87895e58fb since display_frames in increased by a possibly negative number it had better be signed
nicodvb
parents: 21484
diff changeset
197 int64_t display_frame;
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
198 mp_mpeg_header_t picture;
18183
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
199 int max_buffer_size;
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
200 buffer_track_t *buffer_track;
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
201 int track_pos, track_len, track_bufsize; //pos and len control the array, bufsize is the size of the buffer
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
202 unsigned char *pack;
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
203 int pack_offset, pes_offset, pes_set, payload_offset;
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
204 int frames;
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
205 int last_frame_rest; //the rest of the previous frame
18181
afaa492536f6 new code to simplify assignment of timestamps; removed temp_ref from mpeg_frame_t and modified add_frame() accordingly; removed no more used drop_delayed_audio() and save_delayed_audio()
nicodvb
parents: 18166
diff changeset
206 int is_ready;
18248
595d94213ad0 when muxing mpeg audio streams analyze the first 32 KB of data to obtain the most likely correct layer, otherwise every misdetection during parse_audio() will lead to wrong timestamps and loss of synchrony
nicodvb
parents: 18238
diff changeset
207 int mpa_layer;
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
208 } muxer_headers_t;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
209
17600
6fa1149d8c80 experimental film2pal and ntsc2pal soft teleciner
nicodvb
parents: 17591
diff changeset
210 #define PULLDOWN32 1
6fa1149d8c80 experimental film2pal and ntsc2pal soft teleciner
nicodvb
parents: 17591
diff changeset
211 #define TELECINE_FILM2PAL 2
21467
dd765bcd83aa added generalized teleciner by Donald Graft
nicodvb
parents: 21448
diff changeset
212 #define TELECINE_DGPULLDOWN 3
8585
27da710563c2 the long-waited MUXER layer, and new MPEG-PS muxer
arpi
parents:
diff changeset
213
30958
d05a77bed63f Mark muxer-related m_option_t arrays as const.
diego
parents: 30702
diff changeset
214 const m_option_t mpegopts_conf[] = {
22243
e085c85b29af all options must be GLOBAL; patch by Trent Piepho (xyzzy speakeasy org)
nicodvb
parents: 22142
diff changeset
215 {"format", &(conf_mux), CONF_TYPE_STRING, M_OPT_GLOBAL, 0 ,0, NULL},
e085c85b29af all options must be GLOBAL; patch by Trent Piepho (xyzzy speakeasy org)
nicodvb
parents: 22142
diff changeset
216 {"size", &(conf_packet_size), CONF_TYPE_INT, M_OPT_GLOBAL|M_OPT_RANGE, 0, 65535, NULL},
e085c85b29af all options must be GLOBAL; patch by Trent Piepho (xyzzy speakeasy org)
nicodvb
parents: 22142
diff changeset
217 {"muxrate", &(conf_muxrate), CONF_TYPE_INT, M_OPT_GLOBAL|M_OPT_RANGE, 0, 12000000, NULL}, //12 Mb/s
e085c85b29af all options must be GLOBAL; patch by Trent Piepho (xyzzy speakeasy org)
nicodvb
parents: 22142
diff changeset
218 {"vaspect", &(conf_vaspect), CONF_TYPE_FLOAT, M_OPT_GLOBAL, 0, 0, NULL},
e085c85b29af all options must be GLOBAL; patch by Trent Piepho (xyzzy speakeasy org)
nicodvb
parents: 22142
diff changeset
219 {"vframerate", &(conf_vframerate), CONF_TYPE_FLOAT, M_OPT_GLOBAL, 0, 0, NULL},
e085c85b29af all options must be GLOBAL; patch by Trent Piepho (xyzzy speakeasy org)
nicodvb
parents: 22142
diff changeset
220 {"vwidth", &(conf_vwidth), CONF_TYPE_INT, M_OPT_GLOBAL|M_OPT_RANGE, 1, 4095, NULL},
e085c85b29af all options must be GLOBAL; patch by Trent Piepho (xyzzy speakeasy org)
nicodvb
parents: 22142
diff changeset
221 {"vheight", &(conf_vheight), CONF_TYPE_INT, M_OPT_GLOBAL|M_OPT_RANGE, 1, 4095, NULL},
e085c85b29af all options must be GLOBAL; patch by Trent Piepho (xyzzy speakeasy org)
nicodvb
parents: 22142
diff changeset
222 {"vpswidth", &(conf_panscan_width), CONF_TYPE_INT, M_OPT_GLOBAL|M_OPT_RANGE, 1, 16383, NULL},
e085c85b29af all options must be GLOBAL; patch by Trent Piepho (xyzzy speakeasy org)
nicodvb
parents: 22142
diff changeset
223 {"vpsheight", &(conf_panscan_height), CONF_TYPE_INT, M_OPT_GLOBAL|M_OPT_RANGE, 1, 16383, NULL},
e085c85b29af all options must be GLOBAL; patch by Trent Piepho (xyzzy speakeasy org)
nicodvb
parents: 22142
diff changeset
224 {"vbitrate", &(conf_vbitrate), CONF_TYPE_INT, M_OPT_GLOBAL|M_OPT_RANGE, 1, 104857599, NULL},
22881
2d01760be338 removed init_apts and init_vpts; added :adelay in addition to :vdelay
nicodvb
parents: 22879
diff changeset
225 {"vdelay", &conf_init_vdelay, CONF_TYPE_INT, M_OPT_GLOBAL|M_OPT_RANGE, 0, 32760, NULL},
2d01760be338 removed init_apts and init_vpts; added :adelay in addition to :vdelay
nicodvb
parents: 22879
diff changeset
226 {"adelay", &conf_init_adelay, CONF_TYPE_INT, M_OPT_GLOBAL|M_OPT_RANGE, 0, 32760, NULL},
22243
e085c85b29af all options must be GLOBAL; patch by Trent Piepho (xyzzy speakeasy org)
nicodvb
parents: 22142
diff changeset
227 {"vbuf_size", &conf_vbuf_size, CONF_TYPE_INT, M_OPT_GLOBAL|M_OPT_RANGE, 40, 1194, NULL},
e085c85b29af all options must be GLOBAL; patch by Trent Piepho (xyzzy speakeasy org)
nicodvb
parents: 22142
diff changeset
228 {"abuf_size", &conf_abuf_size, CONF_TYPE_INT, M_OPT_GLOBAL|M_OPT_RANGE, 4, 64, NULL},
e085c85b29af all options must be GLOBAL; patch by Trent Piepho (xyzzy speakeasy org)
nicodvb
parents: 22142
diff changeset
229 {"drop", &conf_drop, CONF_TYPE_FLAG, M_OPT_GLOBAL, 0, 1, NULL},
e085c85b29af all options must be GLOBAL; patch by Trent Piepho (xyzzy speakeasy org)
nicodvb
parents: 22142
diff changeset
230 {"tsaf", &conf_ts_allframes, CONF_TYPE_FLAG, M_OPT_GLOBAL, 0, 1, NULL},
e085c85b29af all options must be GLOBAL; patch by Trent Piepho (xyzzy speakeasy org)
nicodvb
parents: 22142
diff changeset
231 {"telecine", &conf_telecine, CONF_TYPE_FLAG, M_OPT_GLOBAL, 0, PULLDOWN32, NULL},
22929
a60dbae6ee1d added :interleaving2, a better method to determine which stream whouls be flushed
nicodvb
parents: 22927
diff changeset
232 {"interleaving2", &conf_interleaving2, CONF_TYPE_FLAG, M_OPT_GLOBAL, 0, 1, NULL},
22243
e085c85b29af all options must be GLOBAL; patch by Trent Piepho (xyzzy speakeasy org)
nicodvb
parents: 22142
diff changeset
233 {"film2pal", &conf_telecine, CONF_TYPE_FLAG, M_OPT_GLOBAL, 0, TELECINE_FILM2PAL, NULL},
e085c85b29af all options must be GLOBAL; patch by Trent Piepho (xyzzy speakeasy org)
nicodvb
parents: 22142
diff changeset
234 {"tele_src", &(conf_telecine_src), CONF_TYPE_FLOAT, M_OPT_GLOBAL, 0, 0, NULL},
e085c85b29af all options must be GLOBAL; patch by Trent Piepho (xyzzy speakeasy org)
nicodvb
parents: 22142
diff changeset
235 {"tele_dest", &(conf_telecine_dest), CONF_TYPE_FLOAT, M_OPT_GLOBAL, 0, 0, NULL},
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
236 {NULL, NULL, 0, 0, 0, 0, NULL}
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
237 };
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
238
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
239 static void fix_audio_sys_header(muxer_priv_t *priv, uint8_t id, uint8_t newid, uint32_t size)
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
240 {
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
241 uint8_t i;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
242
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
243 for(i = 0; i < priv->sys_info.cnt; i++)
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
244 {
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
245 if(priv->sys_info.streams[i].id == id)
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
246 {
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
247 priv->sys_info.streams[i].id = newid;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
248 priv->sys_info.streams[i].type = 1;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
249 priv->sys_info.streams[i].bufsize = size;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
250 }
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
251 }
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
252 }
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
253
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
254 static inline int is_mpeg1(uint32_t x)
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
255 {
26758
9fb1d2c3dbd4 cosmetics: Remove pointless parentheses from return statements.
diego
parents: 26570
diff changeset
256 return
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
257 (x == 0x10000001) ||
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
258 (x == mmioFOURCC('m','p','g','1')) ||
26758
9fb1d2c3dbd4 cosmetics: Remove pointless parentheses from return statements.
diego
parents: 26570
diff changeset
259 (x == mmioFOURCC('M','P','G','1'));
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
260 }
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
261
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
262 static inline int is_mpeg2(uint32_t x)
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
263 {
26758
9fb1d2c3dbd4 cosmetics: Remove pointless parentheses from return statements.
diego
parents: 26570
diff changeset
264 return
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
265 (x == 0x10000002) ||
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
266 (x == mmioFOURCC('m','p','g','2')) ||
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
267 (x == mmioFOURCC('M','P','G','2')) ||
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
268 (x == mmioFOURCC('m','p','e','g')) ||
26758
9fb1d2c3dbd4 cosmetics: Remove pointless parentheses from return statements.
diego
parents: 26570
diff changeset
269 (x == mmioFOURCC('M','P','E','G'));
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
270 }
8585
27da710563c2 the long-waited MUXER layer, and new MPEG-PS muxer
arpi
parents:
diff changeset
271
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
272 static inline int is_mpeg4(uint32_t x)
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
273 {
26758
9fb1d2c3dbd4 cosmetics: Remove pointless parentheses from return statements.
diego
parents: 26570
diff changeset
274 return
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
275 (x == 0x10000004) ||
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
276 (x == mmioFOURCC('d','i','v','x')) ||
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
277 (x == mmioFOURCC('D','I','V','X')) ||
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
278 (x == mmioFOURCC('x','v','i','d')) ||
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
279 (x == mmioFOURCC('X','V','I','D')) ||
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
280 (x == mmioFOURCC('X','v','i','D')) ||
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
281 (x == mmioFOURCC('x','v','i','x')) ||
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
282 (x == mmioFOURCC('X','V','I','X')) ||
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
283 (x == mmioFOURCC('m','p','4','v')) ||
14880
991f5a7b1b7d telecine now works in display order (rather than decoding), as far as there are no more than 4 consecutive b-frames; added support for FMP4
nicodvb
parents: 14840
diff changeset
284 (x == mmioFOURCC('M','P','4','V')) ||
991f5a7b1b7d telecine now works in display order (rather than decoding), as far as there are no more than 4 consecutive b-frames; added support for FMP4
nicodvb
parents: 14840
diff changeset
285 (x == mmioFOURCC('F', 'M','P','4')) ||
18164
c692440493c8 added support for DX50 and dx50 4CCs
nicodvb
parents: 18163
diff changeset
286 (x == mmioFOURCC('f', 'm','p','4')) ||
c692440493c8 added support for DX50 and dx50 4CCs
nicodvb
parents: 18163
diff changeset
287 (x == mmioFOURCC('D', 'X','5','0')) ||
26758
9fb1d2c3dbd4 cosmetics: Remove pointless parentheses from return statements.
diego
parents: 26570
diff changeset
288 (x == mmioFOURCC('d', 'x','5','0'));
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
289 }
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
290
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
291 //from unrarlib.c
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
292 static uint32_t CalcCRC32(uint8_t *buff, uint32_t size)
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
293 {
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
294 uint32_t i, j, CRCTab[256], crc;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
295
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
296 for(i = 0;i < 256; i++)
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
297 {
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
298 for(crc = i, j = 0; j < 8; j++)
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
299 crc= (crc & 1) ? (crc >> 1)^0xEDB88320L : (crc >> 1);
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
300 CRCTab[i] = crc;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
301 }
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
302
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
303
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
304 crc = 0xffffffff;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
305 for(i = 0; i < size; i++)
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
306 crc = (crc << 8) ^ CRCTab[((crc >> 24) ^ buff[i]) & 0xff];
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
307
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
308 return crc;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
309 }
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
310
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
311
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
312 static void add_to_psm(muxer_priv_t *priv, uint8_t id, uint32_t format)
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
313 {
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
314 uint8_t i;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
315
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
316 i = priv->psm_info.cnt;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
317 priv->psm_info.streams[i].id = id;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
318 priv->psm_info.streams[i].format = format;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
319
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
320 if(is_mpeg1(format))
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
321 priv->psm_info.streams[i].type = 0x01;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
322 else if(is_mpeg2(format))
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
323 priv->psm_info.streams[i].type = 0x02;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
324 else if(is_mpeg4(format))
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
325 priv->psm_info.streams[i].type = 0x10;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
326 else if(format == AUDIO_MP2 || format == AUDIO_MP3)
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
327 priv->psm_info.streams[i].type = 0x03;
15278
a45c7e1b998f added support for AAC; moved most of MSGL_V to MSGL_DBG2 to reduce verbosity
nicodvb
parents: 15083
diff changeset
328 else if(format == AUDIO_AAC1 || format == AUDIO_AAC2)
a45c7e1b998f added support for AAC; moved most of MSGL_V to MSGL_DBG2 to reduce verbosity
nicodvb
parents: 15083
diff changeset
329 priv->psm_info.streams[i].type = 0x0f;
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
330 else
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
331 priv->psm_info.streams[i].type = 0x81;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
332
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
333 if(format == AUDIO_A52)
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
334 memcpy((char*) &(priv->psm_info.streams[i].format), "AC-3", 4);
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
335
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
336 priv->psm_info.cnt++;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
337 }
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
338
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
339
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
340 static mpeg_frame_t *init_frames(uint16_t num, size_t size)
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
341 {
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
342 mpeg_frame_t *tmp;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
343 uint16_t i;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
344
30702
9fc9d1e788aa Do not cast the results of malloc/calloc/realloc.
diego
parents: 30633
diff changeset
345 tmp = calloc(num, sizeof(mpeg_frame_t));
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
346 if(tmp == NULL)
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
347 return NULL;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
348
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
349 for(i=0; i < num; i++)
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
350 {
30702
9fc9d1e788aa Do not cast the results of malloc/calloc/realloc.
diego
parents: 30633
diff changeset
351 tmp[i].buffer = calloc(1, size);
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
352 if(tmp[i].buffer == NULL)
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
353 return NULL;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
354 tmp[i].size = 0;
17298
104b09de82b9 removed broken frame reording code; unified audio and video frame storing code (in memory, not in the packets); simple workaround to handle non-standard framerate mpeg1/2 video
nicodvb
parents: 17271
diff changeset
355 tmp[i].pos = 0;
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
356 tmp[i].alloc_size = size;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
357 tmp[i].pts = 0;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
358 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
359
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
360 return tmp;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
361 }
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
362
18181
afaa492536f6 new code to simplify assignment of timestamps; removed temp_ref from mpeg_frame_t and modified add_frame() accordingly; removed no more used drop_delayed_audio() and save_delayed_audio()
nicodvb
parents: 18166
diff changeset
363 static int add_frame(muxer_headers_t *spriv, uint64_t idur, uint8_t *ptr, int len, uint8_t pt, uint64_t dts, uint64_t pts);
8585
27da710563c2 the long-waited MUXER layer, and new MPEG-PS muxer
arpi
parents:
diff changeset
364
27da710563c2 the long-waited MUXER layer, and new MPEG-PS muxer
arpi
parents:
diff changeset
365 static muxer_stream_t* mpegfile_new_stream(muxer_t *muxer,int type){
18196
f7f6984638f8 finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents: 18192
diff changeset
366 muxer_priv_t *priv = (muxer_priv_t*) muxer->priv;
8585
27da710563c2 the long-waited MUXER layer, and new MPEG-PS muxer
arpi
parents:
diff changeset
367 muxer_stream_t *s;
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
368 muxer_headers_t *spriv;
8585
27da710563c2 the long-waited MUXER layer, and new MPEG-PS muxer
arpi
parents:
diff changeset
369
9007
12fc55eb3373 Cleanup of the muxer API, func parameters muxer & muxer_f eliminated.
arpi
parents: 8585
diff changeset
370 if (!muxer) return NULL;
8585
27da710563c2 the long-waited MUXER layer, and new MPEG-PS muxer
arpi
parents:
diff changeset
371 if(muxer->avih.dwStreams>=MUXER_MAX_STREAMS){
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
372 mp_msg(MSGT_MUXER, MSGL_ERR, "Too many streams! increase MUXER_MAX_STREAMS !\n");
8585
27da710563c2 the long-waited MUXER layer, and new MPEG-PS muxer
arpi
parents:
diff changeset
373 return NULL;
27da710563c2 the long-waited MUXER layer, and new MPEG-PS muxer
arpi
parents:
diff changeset
374 }
27da710563c2 the long-waited MUXER layer, and new MPEG-PS muxer
arpi
parents:
diff changeset
375 switch (type) {
27da710563c2 the long-waited MUXER layer, and new MPEG-PS muxer
arpi
parents:
diff changeset
376 case MUXER_TYPE_VIDEO:
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
377 if (muxer->num_videos >= 16) {
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
378 mp_msg(MSGT_MUXER, MSGL_ERR, "MPEG files can't contain more than 16 video streams!\n");
8585
27da710563c2 the long-waited MUXER layer, and new MPEG-PS muxer
arpi
parents:
diff changeset
379 return NULL;
27da710563c2 the long-waited MUXER layer, and new MPEG-PS muxer
arpi
parents:
diff changeset
380 }
27da710563c2 the long-waited MUXER layer, and new MPEG-PS muxer
arpi
parents:
diff changeset
381 break;
27da710563c2 the long-waited MUXER layer, and new MPEG-PS muxer
arpi
parents:
diff changeset
382 case MUXER_TYPE_AUDIO:
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
383 if (muxer->num_audios >= 16) {
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
384 mp_msg(MSGT_MUXER, MSGL_ERR, "MPEG files can't contain more than 16 audio streams!\n");
8585
27da710563c2 the long-waited MUXER layer, and new MPEG-PS muxer
arpi
parents:
diff changeset
385 return NULL;
27da710563c2 the long-waited MUXER layer, and new MPEG-PS muxer
arpi
parents:
diff changeset
386 }
27da710563c2 the long-waited MUXER layer, and new MPEG-PS muxer
arpi
parents:
diff changeset
387 break;
27da710563c2 the long-waited MUXER layer, and new MPEG-PS muxer
arpi
parents:
diff changeset
388 default:
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
389 mp_msg(MSGT_MUXER, MSGL_ERR, "Unknown stream type!\n");
8585
27da710563c2 the long-waited MUXER layer, and new MPEG-PS muxer
arpi
parents:
diff changeset
390 return NULL;
27da710563c2 the long-waited MUXER layer, and new MPEG-PS muxer
arpi
parents:
diff changeset
391 }
30702
9fc9d1e788aa Do not cast the results of malloc/calloc/realloc.
diego
parents: 30633
diff changeset
392 s = calloc(1, sizeof(muxer_stream_t));
8585
27da710563c2 the long-waited MUXER layer, and new MPEG-PS muxer
arpi
parents:
diff changeset
393 if(!s) return NULL; // no mem!?
18196
f7f6984638f8 finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents: 18192
diff changeset
394 if (!(s->b_buffer = malloc(priv->packet_size)))
f7f6984638f8 finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents: 18192
diff changeset
395 goto init_fail;
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
396 s->b_buffer_size = priv->packet_size;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
397 s->b_buffer_ptr = 0;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
398 s->b_buffer_len = 0;
30702
9fc9d1e788aa Do not cast the results of malloc/calloc/realloc.
diego
parents: 30633
diff changeset
399 s->priv = calloc(1, sizeof(muxer_headers_t));
18196
f7f6984638f8 finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents: 18192
diff changeset
400 if(s->priv == NULL)
f7f6984638f8 finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents: 18192
diff changeset
401 goto init_fail;
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
402 spriv = (muxer_headers_t *) s->priv;
18196
f7f6984638f8 finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents: 18192
diff changeset
403 spriv->pack = malloc(priv->packet_size);
f7f6984638f8 finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents: 18192
diff changeset
404 if(! spriv->pack)
f7f6984638f8 finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents: 18192
diff changeset
405 goto init_fail;
f7f6984638f8 finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents: 18192
diff changeset
406 spriv->buffer_track = calloc(1, 4096*sizeof(buffer_track_t));
f7f6984638f8 finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents: 18192
diff changeset
407 if(!spriv->buffer_track)
f7f6984638f8 finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents: 18192
diff changeset
408 goto init_fail;
f7f6984638f8 finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents: 18192
diff changeset
409 spriv->track_pos = 0;
f7f6984638f8 finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents: 18192
diff changeset
410 spriv->track_len = 4096;
8585
27da710563c2 the long-waited MUXER layer, and new MPEG-PS muxer
arpi
parents:
diff changeset
411 muxer->streams[muxer->avih.dwStreams]=s;
27da710563c2 the long-waited MUXER layer, and new MPEG-PS muxer
arpi
parents:
diff changeset
412 s->type=type;
27da710563c2 the long-waited MUXER layer, and new MPEG-PS muxer
arpi
parents:
diff changeset
413 s->id=muxer->avih.dwStreams;
9007
12fc55eb3373 Cleanup of the muxer API, func parameters muxer & muxer_f eliminated.
arpi
parents: 8585
diff changeset
414 s->muxer=muxer;
22879
910cdc3f2afb cosmetics: removed trailing spaces
nicodvb
parents: 22861
diff changeset
415
11223
b677b25a898d update by Andriy N. Gritsenko <andrej@lucky.net>
alex
parents: 9007
diff changeset
416 if (type == MUXER_TYPE_VIDEO) {
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
417 spriv->type = 1;
18181
afaa492536f6 new code to simplify assignment of timestamps; removed temp_ref from mpeg_frame_t and modified add_frame() accordingly; removed no more used drop_delayed_audio() and save_delayed_audio()
nicodvb
parents: 18166
diff changeset
418 spriv->last_pts = conf_init_vpts * 90 * 300;
22881
2d01760be338 removed init_apts and init_vpts; added :adelay in addition to :vdelay
nicodvb
parents: 22879
diff changeset
419 if(conf_init_vdelay) {
2d01760be338 removed init_apts and init_vpts; added :adelay in addition to :vdelay
nicodvb
parents: 22879
diff changeset
420 spriv->last_dts += conf_init_vdelay * 90 * 300;
2d01760be338 removed init_apts and init_vpts; added :adelay in addition to :vdelay
nicodvb
parents: 22879
diff changeset
421 spriv->last_pts += conf_init_vdelay * 90 * 300;
2d01760be338 removed init_apts and init_vpts; added :adelay in addition to :vdelay
nicodvb
parents: 22879
diff changeset
422 }
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
423 spriv->id = 0xe0 + muxer->num_videos;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
424 s->ckid = be2me_32 (0x100 + spriv->id);
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
425 if(priv->is_genmpeg1 || priv->is_genmpeg2) {
21413
06d63614eeaa permit to specify the sizes of the decoders' buffers
nicodvb
parents: 21372
diff changeset
426 int v = (conf_vbuf_size ? conf_vbuf_size*1024 :
06d63614eeaa permit to specify the sizes of the decoders' buffers
nicodvb
parents: 21372
diff changeset
427 (s->h.dwSuggestedBufferSize ? s->h.dwSuggestedBufferSize : 46*1024));
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
428 int n = priv->sys_info.cnt;
22879
910cdc3f2afb cosmetics: removed trailing spaces
nicodvb
parents: 22861
diff changeset
429
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
430 priv->sys_info.streams[n].id = spriv->id;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
431 priv->sys_info.streams[n].type = 1;
21413
06d63614eeaa permit to specify the sizes of the decoders' buffers
nicodvb
parents: 21372
diff changeset
432 priv->sys_info.streams[n].bufsize = v;
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
433 priv->sys_info.cnt++;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
434 }
11223
b677b25a898d update by Andriy N. Gritsenko <andrej@lucky.net>
alex
parents: 9007
diff changeset
435 muxer->num_videos++;
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
436 priv->has_video++;
11223
b677b25a898d update by Andriy N. Gritsenko <andrej@lucky.net>
alex
parents: 9007
diff changeset
437 s->h.fccType=streamtypeVIDEO;
b677b25a898d update by Andriy N. Gritsenko <andrej@lucky.net>
alex
parents: 9007
diff changeset
438 if(!muxer->def_v) muxer->def_v=s;
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
439 spriv->framebuf_cnt = 30;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
440 spriv->framebuf_used = 0;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
441 spriv->framebuf = init_frames(spriv->framebuf_cnt, (size_t) 5000);
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
442 if(spriv->framebuf == NULL) {
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
443 mp_msg(MSGT_MUXER, MSGL_FATAL, "Couldn't allocate initial frames structure, abort!\n");
18196
f7f6984638f8 finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents: 18192
diff changeset
444 goto init_fail;
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
445 }
18196
f7f6984638f8 finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents: 18192
diff changeset
446 memset(&(spriv->picture), 0, sizeof(spriv->picture));
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
447 if(priv->is_xvcd)
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
448 spriv->min_pes_hlen = 18;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
449 else if(priv->is_xsvcd)
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
450 spriv->min_pes_hlen = 22;
14840
d49482c5d8ac soft telecine support! :)) patch by nico
rfelker
parents: 14809
diff changeset
451 spriv->telecine = conf_telecine;
11223
b677b25a898d update by Andriy N. Gritsenko <andrej@lucky.net>
alex
parents: 9007
diff changeset
452 mp_msg (MSGT_MUXER, MSGL_DBG2, "Added video stream %d, ckid=%X\n", muxer->num_videos, s->ckid);
b677b25a898d update by Andriy N. Gritsenko <andrej@lucky.net>
alex
parents: 9007
diff changeset
453 } else { // MUXER_TYPE_AUDIO
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
454 spriv->type = 0;
18181
afaa492536f6 new code to simplify assignment of timestamps; removed temp_ref from mpeg_frame_t and modified add_frame() accordingly; removed no more used drop_delayed_audio() and save_delayed_audio()
nicodvb
parents: 18166
diff changeset
455 spriv->drop_delayed_frames = conf_drop;
afaa492536f6 new code to simplify assignment of timestamps; removed temp_ref from mpeg_frame_t and modified add_frame() accordingly; removed no more used drop_delayed_audio() and save_delayed_audio()
nicodvb
parents: 18166
diff changeset
456 spriv->last_pts = conf_init_apts * 90 * 300;
22881
2d01760be338 removed init_apts and init_vpts; added :adelay in addition to :vdelay
nicodvb
parents: 22879
diff changeset
457 if(conf_init_adelay && ! spriv->drop_delayed_frames)
2d01760be338 removed init_apts and init_vpts; added :adelay in addition to :vdelay
nicodvb
parents: 22879
diff changeset
458 spriv->last_pts += conf_init_adelay * 90 * 300;
18181
afaa492536f6 new code to simplify assignment of timestamps; removed temp_ref from mpeg_frame_t and modified add_frame() accordingly; removed no more used drop_delayed_audio() and save_delayed_audio()
nicodvb
parents: 18166
diff changeset
459 spriv->pts = spriv->last_pts;
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
460 spriv->id = 0xc0 + muxer->num_audios;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
461 s->ckid = be2me_32 (0x100 + spriv->id);
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
462 if(priv->is_genmpeg1 || priv->is_genmpeg2) {
21413
06d63614eeaa permit to specify the sizes of the decoders' buffers
nicodvb
parents: 21372
diff changeset
463 int a1 = (conf_abuf_size ? conf_abuf_size*1024 :
06d63614eeaa permit to specify the sizes of the decoders' buffers
nicodvb
parents: 21372
diff changeset
464 (s->h.dwSuggestedBufferSize ? s->h.dwSuggestedBufferSize : 4*1024));
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
465 int n = priv->sys_info.cnt;
22879
910cdc3f2afb cosmetics: removed trailing spaces
nicodvb
parents: 22861
diff changeset
466
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
467 priv->sys_info.streams[n].id = spriv->id;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
468 priv->sys_info.streams[n].type = 0;
21413
06d63614eeaa permit to specify the sizes of the decoders' buffers
nicodvb
parents: 21372
diff changeset
469 priv->sys_info.streams[n].bufsize = a1;
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
470 priv->sys_info.cnt++;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
471 }
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
472 if(priv->is_xvcd)
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
473 spriv->min_pes_hlen = 13;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
474 else if(priv->is_xsvcd)
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
475 spriv->min_pes_hlen = 17;
22879
910cdc3f2afb cosmetics: removed trailing spaces
nicodvb
parents: 22861
diff changeset
476
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
477 muxer->num_audios++;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
478 priv->has_audio++;
11223
b677b25a898d update by Andriy N. Gritsenko <andrej@lucky.net>
alex
parents: 9007
diff changeset
479 s->h.fccType=streamtypeAUDIO;
15947
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
480
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
481 spriv->framebuf_cnt = 30;
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
482 spriv->framebuf_used = 0;
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
483 spriv->framebuf = init_frames(spriv->framebuf_cnt, (size_t) 2048);
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
484 if(spriv->framebuf == NULL) {
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
485 mp_msg(MSGT_MUXER, MSGL_FATAL, "Couldn't allocate initial frames structure, abort!\n");
18196
f7f6984638f8 finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents: 18192
diff changeset
486 goto init_fail;
15947
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
487 }
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
488
11223
b677b25a898d update by Andriy N. Gritsenko <andrej@lucky.net>
alex
parents: 9007
diff changeset
489 mp_msg (MSGT_MUXER, MSGL_DBG2, "Added audio stream %d, ckid=%X\n", s->id - muxer->num_videos + 1, s->ckid);
b677b25a898d update by Andriy N. Gritsenko <andrej@lucky.net>
alex
parents: 9007
diff changeset
490 }
8585
27da710563c2 the long-waited MUXER layer, and new MPEG-PS muxer
arpi
parents:
diff changeset
491 muxer->avih.dwStreams++;
27da710563c2 the long-waited MUXER layer, and new MPEG-PS muxer
arpi
parents:
diff changeset
492 return s;
18196
f7f6984638f8 finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents: 18192
diff changeset
493
f7f6984638f8 finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents: 18192
diff changeset
494 init_fail:
f7f6984638f8 finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents: 18192
diff changeset
495 if(s)
f7f6984638f8 finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents: 18192
diff changeset
496 {
f7f6984638f8 finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents: 18192
diff changeset
497 if(s->priv)
f7f6984638f8 finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents: 18192
diff changeset
498 {
f7f6984638f8 finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents: 18192
diff changeset
499 spriv = s->priv;
f7f6984638f8 finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents: 18192
diff changeset
500 if(spriv->pack)
f7f6984638f8 finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents: 18192
diff changeset
501 free(spriv->pack);
f7f6984638f8 finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents: 18192
diff changeset
502 if(spriv->buffer_track)
f7f6984638f8 finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents: 18192
diff changeset
503 free(spriv->buffer_track);
f7f6984638f8 finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents: 18192
diff changeset
504 free(s->priv);
f7f6984638f8 finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents: 18192
diff changeset
505 }
f7f6984638f8 finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents: 18192
diff changeset
506 if(s->b_buffer)
f7f6984638f8 finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents: 18192
diff changeset
507 free(s->b_buffer);
f7f6984638f8 finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents: 18192
diff changeset
508 free(s);
f7f6984638f8 finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents: 18192
diff changeset
509 }
f7f6984638f8 finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents: 18192
diff changeset
510 return NULL;
8585
27da710563c2 the long-waited MUXER layer, and new MPEG-PS muxer
arpi
parents:
diff changeset
511 }
27da710563c2 the long-waited MUXER layer, and new MPEG-PS muxer
arpi
parents:
diff changeset
512
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
513 static void write_mpeg_ts(unsigned char *b, uint64_t ts, uint8_t mod) {
18161
516d7874450b changed timebase from 1024 to 300 (no rounding errors with any of the allowed framerates); write scr_extension accordingly. This is the first of a long series of patches to rewrite the muxer
nicodvb
parents: 18044
diff changeset
514 ts /= 300;
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
515 b[0] = mod | ((ts >> 29) & 0xf) | 1;
8585
27da710563c2 the long-waited MUXER layer, and new MPEG-PS muxer
arpi
parents:
diff changeset
516 b[1] = (ts >> 22) & 0xff;
27da710563c2 the long-waited MUXER layer, and new MPEG-PS muxer
arpi
parents:
diff changeset
517 b[2] = ((ts >> 14) & 0xff) | 1;
27da710563c2 the long-waited MUXER layer, and new MPEG-PS muxer
arpi
parents:
diff changeset
518 b[3] = (ts >> 7) & 0xff;
27da710563c2 the long-waited MUXER layer, and new MPEG-PS muxer
arpi
parents:
diff changeset
519 b[4] = ((ts << 1) & 0xff) | 1;
27da710563c2 the long-waited MUXER layer, and new MPEG-PS muxer
arpi
parents:
diff changeset
520 }
27da710563c2 the long-waited MUXER layer, and new MPEG-PS muxer
arpi
parents:
diff changeset
521
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
522
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
523 static void write_mpeg_rate(int type, unsigned char *b, unsigned int rate)
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
524 {
22924
4822223d8425 small syntax fix: muxrate is expressed in units of 400 bits/second, not 50 bytes per second
nicodvb
parents: 22917
diff changeset
525 rate = ((rate*8)+399) / 400;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
526
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
527 if(type == MUX_MPEG1)
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
528 {
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
529 b[0] = ((rate >> 15) & 0x7f) | 0x80;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
530 b[1] = (rate >> 7) & 0xff;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
531 b[2] = ((rate << 1) & 0xff) | 1;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
532 }
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
533 else
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
534 {
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
535 b[0] = (rate >> 14);
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
536 b[1] = (rate >> 6) & 0xff;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
537 b[2] = ((rate & 0x3f) << 2) | 0x03;
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
538 }
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
539 }
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
540
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
541
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
542 static void write_mpeg_std(unsigned char *b, unsigned int size, unsigned int type, uint8_t mod)
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
543 {
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
544 //type = 0:mpeg audio/128, 1:video and pes private streams (including ac3/dts/lpcm)/1024
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
545 if(type == 0) //audio
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
546 size = (size + 127) / 128;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
547 else //video or other
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
548 size = ((size + 1023) / 1024);
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
549
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
550 if(! size)
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
551 size++;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
552
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
553 b[0] = ((size >> 8) & 0x3f) | (type==1 ? 0x60 : 0x40) | mod;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
554 b[1] = size & 0xff;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
555 }
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
556
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
557 static void write_mpeg2_scr(unsigned char *b, uint64_t ts)
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
558 {
18161
516d7874450b changed timebase from 1024 to 300 (no rounding errors with any of the allowed framerates); write scr_extension accordingly. This is the first of a long series of patches to rewrite the muxer
nicodvb
parents: 18044
diff changeset
559 uint16_t t1, t2, t3, scr_ext;
516d7874450b changed timebase from 1024 to 300 (no rounding errors with any of the allowed framerates); write scr_extension accordingly. This is the first of a long series of patches to rewrite the muxer
nicodvb
parents: 18044
diff changeset
560 scr_ext = ts % 300ULL;
516d7874450b changed timebase from 1024 to 300 (no rounding errors with any of the allowed framerates); write scr_extension accordingly. This is the first of a long series of patches to rewrite the muxer
nicodvb
parents: 18044
diff changeset
561 ts /= 300ULL;
516d7874450b changed timebase from 1024 to 300 (no rounding errors with any of the allowed framerates); write scr_extension accordingly. This is the first of a long series of patches to rewrite the muxer
nicodvb
parents: 18044
diff changeset
562 ts &= 0x1FFFFFFFFULL; //33 bits
28576
a6b506faeb34 Replace double semicolon by single semicolon.
diego
parents: 28051
diff changeset
563 t1 = (ts >> 30) & 0x7;
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
564 t2 = (ts >> 15) & 0x7fff;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
565 t3 = ts & 0x7fff;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
566
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
567 b[0] = (t1 << 3 ) | 0x44 | ((t2 >> 13) & 0x3);
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
568 b[1] = (t2 >> 5);
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
569 b[2] = (t2 & 0x1f) << 3 | 0x4 | ((t3 >> 13) & 0x3);
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
570 b[3] = (t3 >> 5);
18161
516d7874450b changed timebase from 1024 to 300 (no rounding errors with any of the allowed framerates); write scr_extension accordingly. This is the first of a long series of patches to rewrite the muxer
nicodvb
parents: 18044
diff changeset
571 b[4] = (t3 & 0x1f) << 3 | ((scr_ext >> 7) & 0x03) | 0x4;
516d7874450b changed timebase from 1024 to 300 (no rounding errors with any of the allowed framerates); write scr_extension accordingly. This is the first of a long series of patches to rewrite the muxer
nicodvb
parents: 18044
diff changeset
572 b[5] = ((scr_ext << 1) & 0xFF) | 1;
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
573 }
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
574
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
575
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
576 static int write_mpeg_pack_header(muxer_t *muxer, char *buff)
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
577 {
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
578 int len;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
579 muxer_priv_t *priv;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
580
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
581 priv = (muxer_priv_t *) muxer->priv;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
582 *(uint32_t *)buff = be2me_32(PACK_HEADER_START_CODE);
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
583 if(priv->mux==MUX_MPEG1)
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
584 {
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
585 write_mpeg_ts(&buff[4], priv->scr, 0x20); // 0010 and SCR
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
586 write_mpeg_rate(priv->mux, &buff[9], muxer->sysrate);
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
587 len = 12;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
588 }
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
589 else
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
590 {
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
591 write_mpeg2_scr(&buff[4], priv->scr); // 0010 and SCR
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
592 write_mpeg_rate(priv->mux, &buff[10], muxer->sysrate);
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
593 buff[13] = 0xf8; //5 bits reserved + 3 set to 0 to indicate 0 stuffing bytes
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
594 len = 14;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
595 }
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
596
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
597 return len;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
598 }
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
599
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
600
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
601 static int write_mpeg_system_header(muxer_t *muxer, char *buff)
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
602 {
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
603 int len;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
604 uint8_t i;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
605 muxer_priv_t *priv;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
606 priv = (muxer_priv_t *) muxer->priv;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
607
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
608 len = 0;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
609 *(uint32_t *)(&buff[len]) = be2me_32(SYSTEM_HEADER_START_CODE);
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
610 len += 4;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
611 *(uint16_t *)(&buff[len]) = 0; //fake length, we'll fix it later
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
612 len += 2;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
613 write_mpeg_rate(MUX_MPEG1, &buff[len], muxer->sysrate);
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
614 len += 3;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
615
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
616 buff[len++] = 0x4 | (priv->is_xvcd ? 1 : 0); //1 audio stream bound, no fixed, CSPS only for xvcd
22925
a8f534c4e071 in the system header set audio_locked/video_locked only for dvd and vcd
nicodvb
parents: 22924
diff changeset
617 //stolen from libavformat
a8f534c4e071 in the system header set audio_locked/video_locked only for dvd and vcd
nicodvb
parents: 22924
diff changeset
618 if(priv->is_xvcd || priv->is_dvd)
22926
92c92f168648 reindentation
nicodvb
parents: 22925
diff changeset
619 buff[len++] = 0xe1; //system_audio_lock, system_video_lock, marker, 1 video stream bound
22925
a8f534c4e071 in the system header set audio_locked/video_locked only for dvd and vcd
nicodvb
parents: 22924
diff changeset
620 else
22926
92c92f168648 reindentation
nicodvb
parents: 22925
diff changeset
621 buff[len++] = 0x21; //marker, 1 video stream bound
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
622
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
623 buff[len++] = ((priv->mux == MUX_MPEG1) ? 0xff : 0x7f); //in mpeg2 there's the packet rate restriction
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
624
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
625 for(i = 0; i < priv->sys_info.cnt; i++)
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
626 {
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
627 buff[len++] = priv->sys_info.streams[i].id;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
628 write_mpeg_std(&buff[len], priv->sys_info.streams[i].bufsize, priv->sys_info.streams[i].type,
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
629 (priv->sys_info.streams[i].type == 1 ? 0xe0: 0xc0));
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
630 len += 2;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
631 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
632
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
633 *(uint16_t *)(&buff[4]) = be2me_16(len - 6); // length field fixed
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
634
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
635 return len;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
636 }
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
637
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
638 static int write_mpeg_psm(muxer_t *muxer, char *buff)
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
639 {
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
640 int len;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
641 uint8_t i;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
642 uint16_t dlen;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
643 muxer_priv_t *priv;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
644 priv = (muxer_priv_t *) muxer->priv;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
645
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
646 len = 0;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
647 *(uint32_t *)(&buff[len]) = be2me_32(PSM_START_CODE);
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
648 len += 4;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
649 *(uint16_t *)(&buff[len]) = 0; //fake length, we'll fix it later
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
650 len += 2;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
651 buff[len++] = 0xe0; //1 current, 2 bits reserved, 5 version 0
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
652 buff[len++] = 0xff; //7 reserved, 1 marker
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
653 buff[len] = buff[len+1] = 0; //length of the program descriptors (unused)
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
654 len += 2;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
655 *(uint16_t *)(&buff[len]) = 0; //length of the es descriptors
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
656 len += 2;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
657
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
658 dlen = 0;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
659 for(i = 0; i < priv->psm_info.cnt; i++)
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
660 {
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
661 if(
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
662 (priv->psm_info.streams[i].id == 0xbd) ||
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
663 (priv->psm_info.streams[i].id >= 0xe0 && priv->psm_info.streams[i].id <= 0xef) ||
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
664 (priv->psm_info.streams[i].id >= 0xc0 && priv->psm_info.streams[i].id <= 0xcf)
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
665 )
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
666 {
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
667 buff[len++] = priv->psm_info.streams[i].type;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
668 buff[len++] = priv->psm_info.streams[i].id;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
669 buff[len++] = 0; //len of descriptor upper ...
24903
b4cdc74f4496 remove the registration descriptor from the PSM: writing the fourcc in it makes it total crap
nicodvb
parents: 24902
diff changeset
670 buff[len++] = 0; //... lower
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
671
24903
b4cdc74f4496 remove the registration descriptor from the PSM: writing the fourcc in it makes it total crap
nicodvb
parents: 24902
diff changeset
672 dlen += 4;
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
673 }
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
674 }
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
675 *(uint16_t *)(&buff[10]) = be2me_16(dlen); //length of the es descriptors
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
676
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
677 *(uint16_t *)(&buff[4]) = be2me_16(len - 6 + 4); // length field fixed, including size of CRC32
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
678
19637
b79f65f98553 forgotten to pass the crc32 be2me_32()
nicodvb
parents: 18958
diff changeset
679 *(uint32_t *)(&buff[len]) = be2me_32(CalcCRC32(buff, len));
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
680
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
681 len += 4; //for crc
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
682
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
683 return len;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
684 }
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
685
24904
75e930e20f48 repeat the PSM once every second (in terms of delta_scr) otherwise playing the file from the middle would miss the first instance
nicodvb
parents: 24903
diff changeset
686 static int psm_is_late(muxer_priv_t *priv)
75e930e20f48 repeat the PSM once every second (in terms of delta_scr) otherwise playing the file from the middle would miss the first instance
nicodvb
parents: 24903
diff changeset
687 {
26758
9fb1d2c3dbd4 cosmetics: Remove pointless parentheses from return statements.
diego
parents: 26570
diff changeset
688 return !priv->data_size || (priv->scr >= priv->last_psm_scr + 27000000ULL);
24904
75e930e20f48 repeat the PSM once every second (in terms of delta_scr) otherwise playing the file from the middle would miss the first instance
nicodvb
parents: 24903
diff changeset
689 }
75e930e20f48 repeat the PSM once every second (in terms of delta_scr) otherwise playing the file from the middle would miss the first instance
nicodvb
parents: 24903
diff changeset
690
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
691 static int write_mpeg_pes_header(muxer_headers_t *h, uint8_t *pes_id, uint8_t *buff, uint16_t plen, int stuffing_len, int mux_type)
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
692 {
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
693 int len;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
694
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
695 len = 0;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
696 memcpy(&buff[len], pes_id, 4);
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
697 len += 4;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
698
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
699 buff[len] = buff[len+1] = 0; //fake len
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
700 len += 2;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
701
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
702 if(mux_type == MUX_MPEG1)
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
703 {
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
704 if(stuffing_len > 0)
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
705 {
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
706 memset(&buff[len], 0xff, stuffing_len);
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
707 len += stuffing_len;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
708 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
709
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
710 if(h->buffer_size > 0)
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
711 {
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
712 write_mpeg_std(&buff[len], h->buffer_size, h->type, 0x40); // 01 is pes1 format
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
713 len += 2;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
714 }
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
715 }
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
716 else //MPEG2
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
717 {
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
718 buff[len] = (h->pes_is_aligned ? 0x84 : 0x80); //0x10...
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
719 len++;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
720 buff[len] = ((h->buffer_size > 0) ? 1 : 0) | (h->pts ? (h->dts ? 0xC0 : 0x80) : 0); //pes extension + pts/dts flags
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
721 len++;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
722 buff[len] = (h->pts ? (h->dts ? 10 : 5) : 0) + ((h->buffer_size > 0) ? 3 : 0) + stuffing_len;//pts + std + stuffing
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
723 len++;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
724 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
725
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
726
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
727 if(h->pts)
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
728 {
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
729 write_mpeg_ts(&buff[len], h->pts, (h->dts ? 0x30 : 0x20)); // 001x and both PTS/DTS
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
730 len += 5;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
731
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
732 if(h->dts)
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
733 {
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
734 write_mpeg_ts(&buff[len], h->dts, 0x10); // 0001 before DTS
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
735 len += 5;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
736 }
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
737 }
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
738 else
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
739 {
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
740 if(mux_type == MUX_MPEG1)
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
741 {
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
742 buff[len] = 0x0f;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
743 len += 1;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
744 }
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
745 }
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
746
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
747
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
748 if(mux_type == MUX_MPEG2)
24902
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
749 {
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
750 if(h->buffer_size > 0)
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
751 {
15947
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
752 buff[len] = 0x1e; //std flag
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
753 len++;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
754
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
755 write_mpeg_std(&buff[len], h->buffer_size, h->type, 0x40);
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
756 len += 2;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
757 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
758
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
759 if(stuffing_len > 0)
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
760 {
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
761 memset(&buff[len], 0xff, stuffing_len);
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
762 len += stuffing_len;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
763 }
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
764 }
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
765
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
766 *((uint16_t*) &buff[4]) = be2me_16(len + plen - 6); //fix pes packet size
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
767 return len;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
768 }
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
769
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
770
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
771 static void write_pes_padding(uint8_t *buff, uint16_t len)
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
772 {
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
773 //6 header bytes + len-6 0xff chars
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
774 buff[0] = buff[1] = 0;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
775 buff[2] = 1;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
776 buff[3] = 0xbe;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
777 *((uint16_t*) &buff[4]) = be2me_16(len - 6);
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
778 memset(&buff[6], 0xff, len - 6);
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
779 }
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
780
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
781
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
782 static int write_nav_pack(uint8_t *buff)
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
783 {
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
784 // concatenation of pes_private2 + 03d4 x 0 and pes_private2 + 03fa x 0
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
785 int len;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
786
15278
a45c7e1b998f added support for AAC; moved most of MSGL_V to MSGL_DBG2 to reduce verbosity
nicodvb
parents: 15083
diff changeset
787 mp_msg(MSGT_MUXER, MSGL_DBG3, "NAV\n");
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
788 len = 0;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
789 *(uint32_t *)(&buff[len]) = be2me_32(PES_PRIVATE2);
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
790 len += 4;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
791 buff[len++] = 0x3;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
792 buff[len++] = 0xd4;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
793 memset(&buff[len], 0, 0x03d4);
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
794 len += 0x03d4;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
795
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
796 *(uint32_t *)(&buff[len]) = be2me_32(PES_PRIVATE2);
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
797 len += 4;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
798 buff[len++] = 0x3;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
799 buff[len++] = 0xfa;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
800 memset(&buff[len], 0, 0x03fa);
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
801 len += 0x03fa;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
802
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
803 return len;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
804 }
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
805
24904
75e930e20f48 repeat the PSM once every second (in terms of delta_scr) otherwise playing the file from the middle would miss the first instance
nicodvb
parents: 24903
diff changeset
806 static unsigned int calc_psm_len(muxer_priv_t *priv)
75e930e20f48 repeat the PSM once every second (in terms of delta_scr) otherwise playing the file from the middle would miss the first instance
nicodvb
parents: 24903
diff changeset
807 {
75e930e20f48 repeat the PSM once every second (in terms of delta_scr) otherwise playing the file from the middle would miss the first instance
nicodvb
parents: 24903
diff changeset
808 return 16 + 4*(priv->psm_info.cnt);
75e930e20f48 repeat the PSM once every second (in terms of delta_scr) otherwise playing the file from the middle would miss the first instance
nicodvb
parents: 24903
diff changeset
809 }
75e930e20f48 repeat the PSM once every second (in terms of delta_scr) otherwise playing the file from the middle would miss the first instance
nicodvb
parents: 24903
diff changeset
810
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
811 static uint32_t calc_pes_hlen(int format, muxer_headers_t *h, muxer_priv_t *priv)
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
812 {
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
813 uint32_t len;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
814
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
815 if(format == MUX_MPEG1)
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
816 len = 6;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
817 else
15947
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
818 len = 9;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
819
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
820 if(h->pts)
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
821 {
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
822 len += 5;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
823 if(h->dts)
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
824 len += 5;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
825 }
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
826 else if(format == MUX_MPEG1)
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
827 len += 1;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
828
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
829 if(h->buffer_size > 0)
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
830 {
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
831 if(format == MUX_MPEG2)
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
832 len += 3;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
833 else
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
834 len += 2;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
835 }
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
836
18196
f7f6984638f8 finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents: 18192
diff changeset
837 //len = max(h->min_pes_hlen, len);
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
838
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
839 return len;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
840 }
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
841
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
842
21660
ca9da45d13e9 muxers now write to output muxer->stream rather than to muxer->file
nicodvb
parents: 21544
diff changeset
843 static int write_mpeg_pack(muxer_t *muxer, muxer_stream_t *s, stream_t *stream, int isoend)
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
844 {
18196
f7f6984638f8 finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents: 18192
diff changeset
845 size_t tot, offset;
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
846 muxer_priv_t *priv;
18196
f7f6984638f8 finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents: 18192
diff changeset
847 unsigned char *buff;
f7f6984638f8 finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents: 18192
diff changeset
848 int stuffing_len;
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
849
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
850 priv = (muxer_priv_t *) muxer->priv;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
851 buff = priv->buff;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
852
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
853 if(isoend)
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
854 {
18196
f7f6984638f8 finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents: 18192
diff changeset
855 offset = priv->packet_size - 4;
f7f6984638f8 finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents: 18192
diff changeset
856 write_pes_padding(buff, offset);
f7f6984638f8 finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents: 18192
diff changeset
857 buff[offset + 0] = buff[offset + 1] = 0;
f7f6984638f8 finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents: 18192
diff changeset
858 buff[offset + 2] = 1;
f7f6984638f8 finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents: 18192
diff changeset
859 buff[offset + 3] = 0xb9;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
860
21660
ca9da45d13e9 muxers now write to output muxer->stream rather than to muxer->file
nicodvb
parents: 21544
diff changeset
861 stream_write_buffer(stream, buff, priv->packet_size);
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
862 return 1;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
863 }
18196
f7f6984638f8 finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents: 18192
diff changeset
864 else //FAKE DVD NAV PACK
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
865 {
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
866 offset = write_mpeg_pack_header(muxer, buff);
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
867 offset += write_mpeg_system_header(muxer, &buff[offset]);
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
868
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
869 //priv->update_system_header = 0;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
870
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
871 if(priv->is_dvd)
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
872 offset += write_nav_pack(&buff[offset]);
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
873
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
874 stuffing_len = priv->packet_size - offset;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
875 if(stuffing_len > 0)
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
876 {
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
877 //insert a PES padding packet
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
878 write_pes_padding(&buff[offset], stuffing_len);
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
879 offset += stuffing_len;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
880 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
881
21660
ca9da45d13e9 muxers now write to output muxer->stream rather than to muxer->file
nicodvb
parents: 21544
diff changeset
882 stream_write_buffer(stream, buff, offset);
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
883 priv->headers_size += offset;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
884 tot = offset;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
885 muxer->movi_end += tot;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
886
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
887 return tot;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
888 }
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
889 }
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
890
22142
84f95595f31f Fix a few gcc warnings, approved by Diego and Reimar.
rathann
parents: 21660
diff changeset
891 static void update_demux_bufsize(muxer_headers_t *spriv, uint64_t dts, int framelen, int type)
18183
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
892 {
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
893 int dim = (spriv->track_len+16)*sizeof(buffer_track_t);
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
894
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
895 if(spriv->track_pos+1 >= spriv->track_len)
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
896 {
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
897 buffer_track_t *tmp = realloc(spriv->buffer_track, dim);
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
898 if(!tmp)
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
899 {
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
900 mp_msg(MSGT_MUXER, MSGL_ERR, "\r\nERROR, couldn't realloc %d bytes for tracking buffer\r\n", dim);
22142
84f95595f31f Fix a few gcc warnings, approved by Diego and Reimar.
rathann
parents: 21660
diff changeset
901 return;
18183
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
902 }
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
903 spriv->buffer_track = tmp;
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
904 memset(&(spriv->buffer_track[spriv->track_pos+1]), 0, 16*sizeof(buffer_track_t));
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
905 spriv->track_len += 16;
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
906 }
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
907
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
908 spriv->buffer_track[spriv->track_pos].size = framelen;
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
909 spriv->buffer_track[spriv->track_pos].dts = dts; //must be dts
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
910
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
911 spriv->track_pos++;
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
912 }
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
913
18196
f7f6984638f8 finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents: 18192
diff changeset
914 static void fix_a52_headers(muxer_stream_t *s)
f7f6984638f8 finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents: 18192
diff changeset
915 {
f7f6984638f8 finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents: 18192
diff changeset
916 muxer_headers_t *spriv = s->priv;
f7f6984638f8 finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents: 18192
diff changeset
917 int x = spriv->payload_offset;
f7f6984638f8 finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents: 18192
diff changeset
918
f7f6984638f8 finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents: 18192
diff changeset
919 spriv->pack[x+0] = 0x80;
f7f6984638f8 finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents: 18192
diff changeset
920 spriv->pack[x+1] = spriv->frames;
f7f6984638f8 finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents: 18192
diff changeset
921 if(spriv->frames)
f7f6984638f8 finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents: 18192
diff changeset
922 {
f7f6984638f8 finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents: 18192
diff changeset
923 spriv->pack[x+2] = ((spriv->last_frame_rest+1) >> 8) & 0xff; //256 * 0 ...
f7f6984638f8 finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents: 18192
diff changeset
924 spriv->pack[x+3] = (spriv->last_frame_rest+1) & 0xff; // + 1 byte(s) to skip
f7f6984638f8 finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents: 18192
diff changeset
925 }
f7f6984638f8 finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents: 18192
diff changeset
926 else
f7f6984638f8 finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents: 18192
diff changeset
927 spriv->pack[x+2] = spriv->pack[x+3] = 0;
f7f6984638f8 finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents: 18192
diff changeset
928 }
f7f6984638f8 finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents: 18192
diff changeset
929
18197
5b06a0b9908e moved inline at beginning of declaration
nicodvb
parents: 18196
diff changeset
930 static inline void remove_frames(muxer_headers_t *spriv, int n)
18183
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
931 {
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
932 mpeg_frame_t tmp;
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
933 int i;
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
934
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
935 for(i = n; i < spriv->framebuf_used; i++)
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
936 {
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
937 tmp = spriv->framebuf[i - n];
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
938 spriv->framebuf[i - n] = spriv->framebuf[i];
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
939 spriv->framebuf[i] = tmp;
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
940 }
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
941 spriv->framebuf_used -= n;
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
942 }
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
943
18192
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
944 static int calc_packet_len(muxer_stream_t *s, int psize, int finalize)
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
945 {
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
946 muxer_headers_t *spriv = s->priv;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
947 int n, len, frpos, m;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
948
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
949 n = len = 0;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
950 frpos = spriv->framebuf[0].pos;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
951 while(len < psize && n < spriv->framebuf_used)
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
952 {
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
953 if(!frpos && len>0 && s->type == MUXER_TYPE_VIDEO && spriv->framebuf[n].type==I_FRAME)
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
954 return len;
21531
a90aa203186c Get rid of min/max macros from aviheader.h, they do not belong here.
reimar
parents: 21486
diff changeset
955 m = FFMIN(spriv->framebuf[n].size - frpos, psize - len);
18192
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
956 len += m;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
957 frpos += m;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
958 if(frpos == spriv->framebuf[n].size)
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
959 {
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
960 frpos = 0;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
961 n++;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
962 }
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
963 }
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
964
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
965 if(len < psize && !finalize)
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
966 return 0;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
967 return len;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
968 }
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
969
18745
19cd9e0f8ac4 prevent buffer overflow in the STD; simplified fill_packet() (moving part of the code to get_packet_stats())
nicodvb
parents: 18558
diff changeset
970 static int find_packet_timestamps(muxer_priv_t *priv, muxer_stream_t *s, unsigned int start, uint64_t *dts, uint64_t *pts)
18192
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
971 {
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
972 muxer_headers_t *spriv = s->priv;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
973 int i, m, pes_hlen, ret, threshold;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
974 uint64_t spts, sdts, dpts;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
975
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
976 if(!spriv->framebuf_used)
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
977 return 0;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
978
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
979 spts = spriv->pts;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
980 sdts = spriv->dts;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
981 spriv->dts = spriv->pts = 0;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
982 ret = 0;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
983 if(spriv->framebuf[0].pos == 0) // start of frame
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
984 i = 0;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
985 else
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
986 {
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
987 pes_hlen = calc_pes_hlen(priv->mux, spriv, priv);
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
988
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
989 if(pes_hlen < spriv->min_pes_hlen)
18192
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
990 pes_hlen = spriv->min_pes_hlen;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
991
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
992 m = spriv->framebuf[0].size - spriv->framebuf[0].pos;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
993
18745
19cd9e0f8ac4 prevent buffer overflow in the STD; simplified fill_packet() (moving part of the code to get_packet_stats())
nicodvb
parents: 18558
diff changeset
994 if(start + pes_hlen + m >= priv->packet_size) //spriv->pack_offset
18192
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
995 i = -1; //this pack won't have a pts: no space available
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
996 else
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
997 {
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
998 if(spriv->framebuf_used < 2)
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
999 goto fail;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1000
18192
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1001 if(spriv->framebuf[1].pts == spriv->framebuf[1].dts)
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1002 threshold = 5;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1003 else
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1004 threshold = 10;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1005
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1006 //headers+frame 0 < space available including timestamps
18745
19cd9e0f8ac4 prevent buffer overflow in the STD; simplified fill_packet() (moving part of the code to get_packet_stats())
nicodvb
parents: 18558
diff changeset
1007 if(start + pes_hlen + m < priv->packet_size - threshold)
18192
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1008 i = 1;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1009 else
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1010 i = -1;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1011 }
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1012 }
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1013
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1014 if(i > -1)
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1015 {
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1016 dpts = FFMAX(spriv->last_saved_pts, spriv->framebuf[i].pts) -
21531
a90aa203186c Get rid of min/max macros from aviheader.h, they do not belong here.
reimar
parents: 21486
diff changeset
1017 FFMIN(spriv->last_saved_pts, spriv->framebuf[i].pts) +
18192
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1018 spriv->framebuf[0].idur;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1019
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1020 if(s->type != MUXER_TYPE_VIDEO)
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1021 ret = 1;
18751
6dd7e4c77e3d try to reduce the distance between consecutive frames with pts to no more than 0.4 seconds (required by dvds)
nicodvb
parents: 18745
diff changeset
1022 else if((spriv->framebuf[i].type == I_FRAME || priv->ts_allframes || dpts >= 36000*300)) //0.4 seconds
18192
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1023 ret = 1;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1024
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1025 if(ret)
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1026 {
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1027 *pts = spriv->framebuf[i].pts;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1028 *dts = spriv->framebuf[i].dts;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1029 if(*dts == *pts)
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1030 *dts = 0;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1031 }
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1032 }
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1033
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1034 fail:
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1035 spriv->pts = spts;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1036 spriv->dts = sdts;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1037 return ret;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1038 }
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1039
18745
19cd9e0f8ac4 prevent buffer overflow in the STD; simplified fill_packet() (moving part of the code to get_packet_stats())
nicodvb
parents: 18558
diff changeset
1040 static int get_packet_stats(muxer_priv_t *priv, muxer_stream_t *s, pack_stats_t *p, int finalize)
19cd9e0f8ac4 prevent buffer overflow in the STD; simplified fill_packet() (moving part of the code to get_packet_stats())
nicodvb
parents: 18558
diff changeset
1041 {
19cd9e0f8ac4 prevent buffer overflow in the STD; simplified fill_packet() (moving part of the code to get_packet_stats())
nicodvb
parents: 18558
diff changeset
1042 muxer_headers_t *spriv = s->priv;
19cd9e0f8ac4 prevent buffer overflow in the STD; simplified fill_packet() (moving part of the code to get_packet_stats())
nicodvb
parents: 18558
diff changeset
1043 int len, len2, pack_hlen, pes_hlen, hlen, target, stflen, stuffing_len;
19cd9e0f8ac4 prevent buffer overflow in the STD; simplified fill_packet() (moving part of the code to get_packet_stats())
nicodvb
parents: 18558
diff changeset
1044 uint64_t pts, dts;
19cd9e0f8ac4 prevent buffer overflow in the STD; simplified fill_packet() (moving part of the code to get_packet_stats())
nicodvb
parents: 18558
diff changeset
1045
19cd9e0f8ac4 prevent buffer overflow in the STD; simplified fill_packet() (moving part of the code to get_packet_stats())
nicodvb
parents: 18558
diff changeset
1046 spriv->pts = spriv->dts = 0;
19cd9e0f8ac4 prevent buffer overflow in the STD; simplified fill_packet() (moving part of the code to get_packet_stats())
nicodvb
parents: 18558
diff changeset
1047 p->dts = p->pts = p->frame_pts = p->frame_dts = 0;
19cd9e0f8ac4 prevent buffer overflow in the STD; simplified fill_packet() (moving part of the code to get_packet_stats())
nicodvb
parents: 18558
diff changeset
1048 p->len = 0;
19cd9e0f8ac4 prevent buffer overflow in the STD; simplified fill_packet() (moving part of the code to get_packet_stats())
nicodvb
parents: 18558
diff changeset
1049
21141
33cce0f7e66c permit muxing to raw pes (VDR uses this)
nicodvb
parents: 20344
diff changeset
1050 if(priv->rawpes)
33cce0f7e66c permit muxing to raw pes (VDR uses this)
nicodvb
parents: 20344
diff changeset
1051 pack_hlen = 0;
33cce0f7e66c permit muxing to raw pes (VDR uses this)
nicodvb
parents: 20344
diff changeset
1052 else if(priv->mux == MUX_MPEG1)
18745
19cd9e0f8ac4 prevent buffer overflow in the STD; simplified fill_packet() (moving part of the code to get_packet_stats())
nicodvb
parents: 18558
diff changeset
1053 pack_hlen = 12;
19cd9e0f8ac4 prevent buffer overflow in the STD; simplified fill_packet() (moving part of the code to get_packet_stats())
nicodvb
parents: 18558
diff changeset
1054 else
19cd9e0f8ac4 prevent buffer overflow in the STD; simplified fill_packet() (moving part of the code to get_packet_stats())
nicodvb
parents: 18558
diff changeset
1055 pack_hlen = 14;
24904
75e930e20f48 repeat the PSM once every second (in terms of delta_scr) otherwise playing the file from the middle would miss the first instance
nicodvb
parents: 24903
diff changeset
1056 if(priv->use_psm && psm_is_late(priv))
75e930e20f48 repeat the PSM once every second (in terms of delta_scr) otherwise playing the file from the middle would miss the first instance
nicodvb
parents: 24903
diff changeset
1057 pack_hlen += calc_psm_len(priv);
18745
19cd9e0f8ac4 prevent buffer overflow in the STD; simplified fill_packet() (moving part of the code to get_packet_stats())
nicodvb
parents: 18558
diff changeset
1058
19cd9e0f8ac4 prevent buffer overflow in the STD; simplified fill_packet() (moving part of the code to get_packet_stats())
nicodvb
parents: 18558
diff changeset
1059 if(find_packet_timestamps(priv, s, pack_hlen, &dts, &pts))
19cd9e0f8ac4 prevent buffer overflow in the STD; simplified fill_packet() (moving part of the code to get_packet_stats())
nicodvb
parents: 18558
diff changeset
1060 {
19cd9e0f8ac4 prevent buffer overflow in the STD; simplified fill_packet() (moving part of the code to get_packet_stats())
nicodvb
parents: 18558
diff changeset
1061 p->pts = p->frame_pts = pts;
19cd9e0f8ac4 prevent buffer overflow in the STD; simplified fill_packet() (moving part of the code to get_packet_stats())
nicodvb
parents: 18558
diff changeset
1062 p->dts = p->frame_dts = dts;
19cd9e0f8ac4 prevent buffer overflow in the STD; simplified fill_packet() (moving part of the code to get_packet_stats())
nicodvb
parents: 18558
diff changeset
1063
19cd9e0f8ac4 prevent buffer overflow in the STD; simplified fill_packet() (moving part of the code to get_packet_stats())
nicodvb
parents: 18558
diff changeset
1064 spriv->pts = pts;
19cd9e0f8ac4 prevent buffer overflow in the STD; simplified fill_packet() (moving part of the code to get_packet_stats())
nicodvb
parents: 18558
diff changeset
1065 spriv->dts = dts;
19cd9e0f8ac4 prevent buffer overflow in the STD; simplified fill_packet() (moving part of the code to get_packet_stats())
nicodvb
parents: 18558
diff changeset
1066 }
19cd9e0f8ac4 prevent buffer overflow in the STD; simplified fill_packet() (moving part of the code to get_packet_stats())
nicodvb
parents: 18558
diff changeset
1067 pes_hlen = calc_pes_hlen(priv->mux, spriv, priv);
19cd9e0f8ac4 prevent buffer overflow in the STD; simplified fill_packet() (moving part of the code to get_packet_stats())
nicodvb
parents: 18558
diff changeset
1068
19cd9e0f8ac4 prevent buffer overflow in the STD; simplified fill_packet() (moving part of the code to get_packet_stats())
nicodvb
parents: 18558
diff changeset
1069 p->stflen = stflen = (spriv->min_pes_hlen > pes_hlen ? spriv->min_pes_hlen - pes_hlen : 0);
19cd9e0f8ac4 prevent buffer overflow in the STD; simplified fill_packet() (moving part of the code to get_packet_stats())
nicodvb
parents: 18558
diff changeset
1070
19cd9e0f8ac4 prevent buffer overflow in the STD; simplified fill_packet() (moving part of the code to get_packet_stats())
nicodvb
parents: 18558
diff changeset
1071 target = len = priv->packet_size - pack_hlen - pes_hlen - stflen; //max space available
19cd9e0f8ac4 prevent buffer overflow in the STD; simplified fill_packet() (moving part of the code to get_packet_stats())
nicodvb
parents: 18558
diff changeset
1072 if(s->type == MUXER_TYPE_AUDIO && s->wf->wFormatTag == AUDIO_A52)
19cd9e0f8ac4 prevent buffer overflow in the STD; simplified fill_packet() (moving part of the code to get_packet_stats())
nicodvb
parents: 18558
diff changeset
1073 hlen = 4;
19cd9e0f8ac4 prevent buffer overflow in the STD; simplified fill_packet() (moving part of the code to get_packet_stats())
nicodvb
parents: 18558
diff changeset
1074 else
19cd9e0f8ac4 prevent buffer overflow in the STD; simplified fill_packet() (moving part of the code to get_packet_stats())
nicodvb
parents: 18558
diff changeset
1075 hlen = 0;
19cd9e0f8ac4 prevent buffer overflow in the STD; simplified fill_packet() (moving part of the code to get_packet_stats())
nicodvb
parents: 18558
diff changeset
1076
19cd9e0f8ac4 prevent buffer overflow in the STD; simplified fill_packet() (moving part of the code to get_packet_stats())
nicodvb
parents: 18558
diff changeset
1077 len -= hlen;
19cd9e0f8ac4 prevent buffer overflow in the STD; simplified fill_packet() (moving part of the code to get_packet_stats())
nicodvb
parents: 18558
diff changeset
1078 target -= hlen;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1079
18745
19cd9e0f8ac4 prevent buffer overflow in the STD; simplified fill_packet() (moving part of the code to get_packet_stats())
nicodvb
parents: 18558
diff changeset
1080 len2 = calc_packet_len(s, target, finalize);
19cd9e0f8ac4 prevent buffer overflow in the STD; simplified fill_packet() (moving part of the code to get_packet_stats())
nicodvb
parents: 18558
diff changeset
1081 if(!len2 || (len2 < target && s->type == MUXER_TYPE_AUDIO && !finalize))
19cd9e0f8ac4 prevent buffer overflow in the STD; simplified fill_packet() (moving part of the code to get_packet_stats())
nicodvb
parents: 18558
diff changeset
1082 {
19cd9e0f8ac4 prevent buffer overflow in the STD; simplified fill_packet() (moving part of the code to get_packet_stats())
nicodvb
parents: 18558
diff changeset
1083 //p->len = 0;
19cd9e0f8ac4 prevent buffer overflow in the STD; simplified fill_packet() (moving part of the code to get_packet_stats())
nicodvb
parents: 18558
diff changeset
1084 //p->dts = p->pts = 0;
19cd9e0f8ac4 prevent buffer overflow in the STD; simplified fill_packet() (moving part of the code to get_packet_stats())
nicodvb
parents: 18558
diff changeset
1085 spriv->pts = spriv->dts = 0;
19cd9e0f8ac4 prevent buffer overflow in the STD; simplified fill_packet() (moving part of the code to get_packet_stats())
nicodvb
parents: 18558
diff changeset
1086 //fprintf(stderr, "\r\nLEN2: %d, target: %d, type: %d\r\n", len2, target, s->type);
19cd9e0f8ac4 prevent buffer overflow in the STD; simplified fill_packet() (moving part of the code to get_packet_stats())
nicodvb
parents: 18558
diff changeset
1087 return 0;
19cd9e0f8ac4 prevent buffer overflow in the STD; simplified fill_packet() (moving part of the code to get_packet_stats())
nicodvb
parents: 18558
diff changeset
1088 }
19cd9e0f8ac4 prevent buffer overflow in the STD; simplified fill_packet() (moving part of the code to get_packet_stats())
nicodvb
parents: 18558
diff changeset
1089
19cd9e0f8ac4 prevent buffer overflow in the STD; simplified fill_packet() (moving part of the code to get_packet_stats())
nicodvb
parents: 18558
diff changeset
1090 len = len2;
19cd9e0f8ac4 prevent buffer overflow in the STD; simplified fill_packet() (moving part of the code to get_packet_stats())
nicodvb
parents: 18558
diff changeset
1091 stuffing_len = 0;
19cd9e0f8ac4 prevent buffer overflow in the STD; simplified fill_packet() (moving part of the code to get_packet_stats())
nicodvb
parents: 18558
diff changeset
1092 if(len < target)
19cd9e0f8ac4 prevent buffer overflow in the STD; simplified fill_packet() (moving part of the code to get_packet_stats())
nicodvb
parents: 18558
diff changeset
1093 {
19cd9e0f8ac4 prevent buffer overflow in the STD; simplified fill_packet() (moving part of the code to get_packet_stats())
nicodvb
parents: 18558
diff changeset
1094 if(s->type == MUXER_TYPE_VIDEO)
19cd9e0f8ac4 prevent buffer overflow in the STD; simplified fill_packet() (moving part of the code to get_packet_stats())
nicodvb
parents: 18558
diff changeset
1095 {
19cd9e0f8ac4 prevent buffer overflow in the STD; simplified fill_packet() (moving part of the code to get_packet_stats())
nicodvb
parents: 18558
diff changeset
1096 if(spriv->pts)
19cd9e0f8ac4 prevent buffer overflow in the STD; simplified fill_packet() (moving part of the code to get_packet_stats())
nicodvb
parents: 18558
diff changeset
1097 target += 5;
19cd9e0f8ac4 prevent buffer overflow in the STD; simplified fill_packet() (moving part of the code to get_packet_stats())
nicodvb
parents: 18558
diff changeset
1098 if(spriv->dts)
19cd9e0f8ac4 prevent buffer overflow in the STD; simplified fill_packet() (moving part of the code to get_packet_stats())
nicodvb
parents: 18558
diff changeset
1099 target += 5;
19cd9e0f8ac4 prevent buffer overflow in the STD; simplified fill_packet() (moving part of the code to get_packet_stats())
nicodvb
parents: 18558
diff changeset
1100 spriv->pts = spriv->dts = 0;
19cd9e0f8ac4 prevent buffer overflow in the STD; simplified fill_packet() (moving part of the code to get_packet_stats())
nicodvb
parents: 18558
diff changeset
1101 p->pts = p->dts = 0;
19cd9e0f8ac4 prevent buffer overflow in the STD; simplified fill_packet() (moving part of the code to get_packet_stats())
nicodvb
parents: 18558
diff changeset
1102 }
19cd9e0f8ac4 prevent buffer overflow in the STD; simplified fill_packet() (moving part of the code to get_packet_stats())
nicodvb
parents: 18558
diff changeset
1103
19cd9e0f8ac4 prevent buffer overflow in the STD; simplified fill_packet() (moving part of the code to get_packet_stats())
nicodvb
parents: 18558
diff changeset
1104 stuffing_len = target - len;
19cd9e0f8ac4 prevent buffer overflow in the STD; simplified fill_packet() (moving part of the code to get_packet_stats())
nicodvb
parents: 18558
diff changeset
1105 if(stuffing_len > 0 && stuffing_len < 7)
19cd9e0f8ac4 prevent buffer overflow in the STD; simplified fill_packet() (moving part of the code to get_packet_stats())
nicodvb
parents: 18558
diff changeset
1106 {
19cd9e0f8ac4 prevent buffer overflow in the STD; simplified fill_packet() (moving part of the code to get_packet_stats())
nicodvb
parents: 18558
diff changeset
1107 if(stflen + stuffing_len > 16)
19cd9e0f8ac4 prevent buffer overflow in the STD; simplified fill_packet() (moving part of the code to get_packet_stats())
nicodvb
parents: 18558
diff changeset
1108 {
19cd9e0f8ac4 prevent buffer overflow in the STD; simplified fill_packet() (moving part of the code to get_packet_stats())
nicodvb
parents: 18558
diff changeset
1109 int x = 7 - stuffing_len;
19cd9e0f8ac4 prevent buffer overflow in the STD; simplified fill_packet() (moving part of the code to get_packet_stats())
nicodvb
parents: 18558
diff changeset
1110 stflen -= x;
19cd9e0f8ac4 prevent buffer overflow in the STD; simplified fill_packet() (moving part of the code to get_packet_stats())
nicodvb
parents: 18558
diff changeset
1111 stuffing_len += x;
19cd9e0f8ac4 prevent buffer overflow in the STD; simplified fill_packet() (moving part of the code to get_packet_stats())
nicodvb
parents: 18558
diff changeset
1112 }
19cd9e0f8ac4 prevent buffer overflow in the STD; simplified fill_packet() (moving part of the code to get_packet_stats())
nicodvb
parents: 18558
diff changeset
1113 else
19cd9e0f8ac4 prevent buffer overflow in the STD; simplified fill_packet() (moving part of the code to get_packet_stats())
nicodvb
parents: 18558
diff changeset
1114 {
19cd9e0f8ac4 prevent buffer overflow in the STD; simplified fill_packet() (moving part of the code to get_packet_stats())
nicodvb
parents: 18558
diff changeset
1115 stflen += stuffing_len;
19cd9e0f8ac4 prevent buffer overflow in the STD; simplified fill_packet() (moving part of the code to get_packet_stats())
nicodvb
parents: 18558
diff changeset
1116 stuffing_len = 0;
19cd9e0f8ac4 prevent buffer overflow in the STD; simplified fill_packet() (moving part of the code to get_packet_stats())
nicodvb
parents: 18558
diff changeset
1117 }
19cd9e0f8ac4 prevent buffer overflow in the STD; simplified fill_packet() (moving part of the code to get_packet_stats())
nicodvb
parents: 18558
diff changeset
1118 }
19cd9e0f8ac4 prevent buffer overflow in the STD; simplified fill_packet() (moving part of the code to get_packet_stats())
nicodvb
parents: 18558
diff changeset
1119 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1120
18745
19cd9e0f8ac4 prevent buffer overflow in the STD; simplified fill_packet() (moving part of the code to get_packet_stats())
nicodvb
parents: 18558
diff changeset
1121 len += hlen;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1122
18745
19cd9e0f8ac4 prevent buffer overflow in the STD; simplified fill_packet() (moving part of the code to get_packet_stats())
nicodvb
parents: 18558
diff changeset
1123 p->len = len;
19cd9e0f8ac4 prevent buffer overflow in the STD; simplified fill_packet() (moving part of the code to get_packet_stats())
nicodvb
parents: 18558
diff changeset
1124 p->stflen = stflen;
19cd9e0f8ac4 prevent buffer overflow in the STD; simplified fill_packet() (moving part of the code to get_packet_stats())
nicodvb
parents: 18558
diff changeset
1125
19cd9e0f8ac4 prevent buffer overflow in the STD; simplified fill_packet() (moving part of the code to get_packet_stats())
nicodvb
parents: 18558
diff changeset
1126 return p->len;
19cd9e0f8ac4 prevent buffer overflow in the STD; simplified fill_packet() (moving part of the code to get_packet_stats())
nicodvb
parents: 18558
diff changeset
1127 }
18192
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1128
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1129 static int fill_packet(muxer_t *muxer, muxer_stream_t *s, int finalize)
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1130 {
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1131 //try to fill a packet as much as possible
25962
afa125da85cf typo fix: inited --> initialized
diego
parents: 25720
diff changeset
1132 //spriv->pack_offset is the start position initialized to 0
18192
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1133 //data is taken from spriv->framebuf
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1134 //if audio and a52 insert the headers
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1135 muxer_priv_t *priv = (muxer_priv_t *) muxer->priv;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1136 muxer_headers_t *spriv = (muxer_headers_t *) s->priv;
18958
a8e681ad7c90 Remove unused variables, patch by Stefan Huehner stefan at huehner org.
diego
parents: 18751
diff changeset
1137 int len, m, n, dvd_pack = 0;
24904
75e930e20f48 repeat the PSM once every second (in terms of delta_scr) otherwise playing the file from the middle would miss the first instance
nicodvb
parents: 24903
diff changeset
1138 int write_psm = 0;
18192
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1139 mpeg_frame_t *frm;
18745
19cd9e0f8ac4 prevent buffer overflow in the STD; simplified fill_packet() (moving part of the code to get_packet_stats())
nicodvb
parents: 18558
diff changeset
1140 pack_stats_t p;
18192
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1141
18745
19cd9e0f8ac4 prevent buffer overflow in the STD; simplified fill_packet() (moving part of the code to get_packet_stats())
nicodvb
parents: 18558
diff changeset
1142 spriv->dts = spriv->pts = 0;
18192
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1143
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1144 if(! spriv->framebuf_used)
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1145 {
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1146 spriv->pack_offset = 0;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1147 return 0;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1148 }
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1149
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1150 if(!spriv->pack_offset)
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1151 {
21141
33cce0f7e66c permit muxing to raw pes (VDR uses this)
nicodvb
parents: 20344
diff changeset
1152 if(priv->rawpes)
33cce0f7e66c permit muxing to raw pes (VDR uses this)
nicodvb
parents: 20344
diff changeset
1153 spriv->pack_offset = 0;
33cce0f7e66c permit muxing to raw pes (VDR uses this)
nicodvb
parents: 20344
diff changeset
1154 else
18192
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1155 spriv->pack_offset = write_mpeg_pack_header(muxer, spriv->pack);
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1156 if(priv->update_system_header && (priv->is_genmpeg1 || priv->is_genmpeg2))
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1157 {
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1158 spriv->pack_offset += write_mpeg_system_header(muxer, &spriv->pack[spriv->pack_offset]);
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1159 priv->update_system_header = 0;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1160 }
24904
75e930e20f48 repeat the PSM once every second (in terms of delta_scr) otherwise playing the file from the middle would miss the first instance
nicodvb
parents: 24903
diff changeset
1161
75e930e20f48 repeat the PSM once every second (in terms of delta_scr) otherwise playing the file from the middle would miss the first instance
nicodvb
parents: 24903
diff changeset
1162 if(priv->use_psm && psm_is_late(priv))
75e930e20f48 repeat the PSM once every second (in terms of delta_scr) otherwise playing the file from the middle would miss the first instance
nicodvb
parents: 24903
diff changeset
1163 {
75e930e20f48 repeat the PSM once every second (in terms of delta_scr) otherwise playing the file from the middle would miss the first instance
nicodvb
parents: 24903
diff changeset
1164 spriv->pack_offset += write_mpeg_psm(muxer, &spriv->pack[spriv->pack_offset]);
75e930e20f48 repeat the PSM once every second (in terms of delta_scr) otherwise playing the file from the middle would miss the first instance
nicodvb
parents: 24903
diff changeset
1165 write_psm = 1;
75e930e20f48 repeat the PSM once every second (in terms of delta_scr) otherwise playing the file from the middle would miss the first instance
nicodvb
parents: 24903
diff changeset
1166 }
75e930e20f48 repeat the PSM once every second (in terms of delta_scr) otherwise playing the file from the middle would miss the first instance
nicodvb
parents: 24903
diff changeset
1167
18192
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1168 spriv->pes_set = 0;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1169 spriv->pes_offset = spriv->pack_offset;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1170 spriv->payload_offset = 0;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1171 spriv->frames = 0;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1172 spriv->last_frame_rest = 0;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1173 }
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1174
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1175 if(!spriv->pes_set)
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1176 {
21413
06d63614eeaa permit to specify the sizes of the decoders' buffers
nicodvb
parents: 21372
diff changeset
1177 int bufsize = 0;
18192
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1178 //search the pts. yes if either it's video && (I-frame or priv->ts_allframes) && framebuf[i].pos == 0
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1179 //or it's audio && framebuf[i].pos == 0
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1180 //NB pts and dts can only be relative to the first frame beginning in this pack
21141
33cce0f7e66c permit muxing to raw pes (VDR uses this)
nicodvb
parents: 20344
diff changeset
1181 if((priv->is_xsvcd || priv->is_xvcd || priv->rawpes) && spriv->size == 0)
21413
06d63614eeaa permit to specify the sizes of the decoders' buffers
nicodvb
parents: 21372
diff changeset
1182 {
06d63614eeaa permit to specify the sizes of the decoders' buffers
nicodvb
parents: 21372
diff changeset
1183 if(s->type == MUXER_TYPE_VIDEO)
06d63614eeaa permit to specify the sizes of the decoders' buffers
nicodvb
parents: 21372
diff changeset
1184 bufsize = (conf_vbuf_size ? conf_vbuf_size : (priv->is_xvcd ? 46 : 232));
06d63614eeaa permit to specify the sizes of the decoders' buffers
nicodvb
parents: 21372
diff changeset
1185 else
06d63614eeaa permit to specify the sizes of the decoders' buffers
nicodvb
parents: 21372
diff changeset
1186 bufsize = (conf_abuf_size ? conf_abuf_size : 4);
06d63614eeaa permit to specify the sizes of the decoders' buffers
nicodvb
parents: 21372
diff changeset
1187 spriv->buffer_size = bufsize*1024;
06d63614eeaa permit to specify the sizes of the decoders' buffers
nicodvb
parents: 21372
diff changeset
1188 }
18192
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1189
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1190 if(priv->is_dvd && s->type == MUXER_TYPE_VIDEO
18192
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1191 && spriv->framebuf[0].type==I_FRAME && spriv->framebuf[0].pos==0)
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1192 dvd_pack = 1;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1193
18745
19cd9e0f8ac4 prevent buffer overflow in the STD; simplified fill_packet() (moving part of the code to get_packet_stats())
nicodvb
parents: 18558
diff changeset
1194 if(! get_packet_stats(priv, s, &p, finalize))
18192
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1195 {
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1196 spriv->pack_offset = 0;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1197 return 0;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1198 }
18745
19cd9e0f8ac4 prevent buffer overflow in the STD; simplified fill_packet() (moving part of the code to get_packet_stats())
nicodvb
parents: 18558
diff changeset
1199 spriv->dts = p.dts;
19cd9e0f8ac4 prevent buffer overflow in the STD; simplified fill_packet() (moving part of the code to get_packet_stats())
nicodvb
parents: 18558
diff changeset
1200 spriv->pts = p.pts;
19cd9e0f8ac4 prevent buffer overflow in the STD; simplified fill_packet() (moving part of the code to get_packet_stats())
nicodvb
parents: 18558
diff changeset
1201 if(spriv->pts)
19cd9e0f8ac4 prevent buffer overflow in the STD; simplified fill_packet() (moving part of the code to get_packet_stats())
nicodvb
parents: 18558
diff changeset
1202 spriv->last_saved_pts = p.pts;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1203
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1204 spriv->pack_offset += write_mpeg_pes_header(spriv, (uint8_t *) &s->ckid, &(spriv->pack[spriv->pack_offset]),
18745
19cd9e0f8ac4 prevent buffer overflow in the STD; simplified fill_packet() (moving part of the code to get_packet_stats())
nicodvb
parents: 18558
diff changeset
1205 p.len, p.stflen, priv->mux);
18192
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1206
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1207 if(s->type == MUXER_TYPE_AUDIO && s->wf->wFormatTag == AUDIO_A52)
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1208 {
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1209 spriv->payload_offset = spriv->pack_offset;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1210 spriv->pack_offset += 4; //for the 4 bytes of header
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1211 if(!spriv->framebuf[0].pos)
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1212 spriv->last_frame_rest = 0;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1213 else
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1214 spriv->last_frame_rest = spriv->framebuf[0].size - spriv->framebuf[0].pos;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1215 }
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1216
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1217 spriv->pes_set = 1;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1218 }
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1219
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1220
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1221 if(spriv->dts || spriv->pts)
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1222 {
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1223 if((spriv->dts && priv->scr >= spriv->dts) || priv->scr >= spriv->pts)
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1224 mp_msg(MSGT_MUXER, MSGL_ERR, "\r\nERROR: scr %.3lf, dts %.3lf, pts %.3lf\r\n", (double) priv->scr/27000000.0, (double) spriv->dts/27000000.0, (double) spriv->pts/27000000.0);
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1225 else if(priv->scr + 63000*300 < spriv->dts)
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1226 mp_msg(MSGT_MUXER, MSGL_INFO, "\r\nWARNING>: scr %.3lf, dts %.3lf, pts %.3lf, diff %.3lf, piff %.3lf\r\n", (double) priv->scr/27000000.0, (double) spriv->dts/27000000.0, (double) spriv->pts/27000000.0, (double)(spriv->dts - priv->scr)/27000000.0, (double)(spriv->pts - priv->scr)/27000000.0);
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1227 }
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1228
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1229 n = 0;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1230 len = 0;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1231
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1232 frm = spriv->framebuf;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1233 while(spriv->pack_offset < priv->packet_size && n < spriv->framebuf_used)
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1234 {
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1235 if(!frm->pos)
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1236 {
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1237 //since iframes must always be aligned at block boundaries exit when we find the
18192
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1238 //beginning of one in the middle of the flush
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1239 if(len > 0 && s->type == MUXER_TYPE_VIDEO && frm->type == I_FRAME)
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1240 {
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1241 break;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1242 }
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1243 spriv->frames++;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1244 update_demux_bufsize(spriv, frm->dts, frm->size, s->type);
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1245 }
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1246
21531
a90aa203186c Get rid of min/max macros from aviheader.h, they do not belong here.
reimar
parents: 21486
diff changeset
1247 m = FFMIN(frm->size - frm->pos, priv->packet_size - spriv->pack_offset);
18192
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1248 memcpy(&(spriv->pack[spriv->pack_offset]), &(frm->buffer[frm->pos]), m);
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1249
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1250 len += m;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1251 spriv->pack_offset += m;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1252 frm->pos += m;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1253
18192
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1254 if(frm->pos == frm->size) //end of frame
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1255 {
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1256 frm->pos = frm->size = 0;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1257 frm->pts = frm->dts = 0;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1258 n++;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1259 frm++;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1260 }
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1261 }
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1262
21141
33cce0f7e66c permit muxing to raw pes (VDR uses this)
nicodvb
parents: 20344
diff changeset
1263 if((priv->is_xsvcd || priv->is_xvcd || priv->rawpes) && spriv->size == 0)
18192
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1264 spriv->buffer_size = 0;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1265
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1266 spriv->size += len;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1267
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1268 if(dvd_pack && (spriv->pack_offset == priv->packet_size))
21660
ca9da45d13e9 muxers now write to output muxer->stream rather than to muxer->file
nicodvb
parents: 21544
diff changeset
1269 write_mpeg_pack(muxer, NULL, muxer->stream, 0); //insert fake Nav Packet
18192
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1270
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1271 if(n > 0)
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1272 remove_frames(spriv, n);
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1273
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1274 spriv->track_bufsize += len;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1275 if(spriv->track_bufsize > spriv->max_buffer_size)
23637
df9aa9eb9de6 Use proper PRI?64 format strings
reimar
parents: 22929
diff changeset
1276 mp_msg(MSGT_MUXER, MSGL_ERR, "\r\nBUFFER OVERFLOW: %d > %d, pts: %"PRIu64"\r\n", spriv->track_bufsize, spriv->max_buffer_size, spriv->pts);
18192
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1277
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1278 if(s->type == MUXER_TYPE_AUDIO && s->wf->wFormatTag == AUDIO_A52)
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1279 fix_a52_headers(s);
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1280
21141
33cce0f7e66c permit muxing to raw pes (VDR uses this)
nicodvb
parents: 20344
diff changeset
1281 if(spriv->pack_offset < priv->packet_size && !priv->rawpes) //here finalize is set
18192
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1282 {
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1283 int diff = priv->packet_size - spriv->pack_offset;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1284 write_pes_padding(&(spriv->pack[spriv->pack_offset]), diff);
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1285 spriv->pack_offset += diff;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1286 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1287
21660
ca9da45d13e9 muxers now write to output muxer->stream rather than to muxer->file
nicodvb
parents: 21544
diff changeset
1288 stream_write_buffer(muxer->stream, spriv->pack, spriv->pack_offset);
18192
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1289
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1290 priv->headers_size += spriv->pack_offset - len;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1291 priv->data_size += len;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1292 muxer->movi_end += spriv->pack_offset;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1293
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1294 spriv->pack_offset = 0;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1295 spriv->pes_set = 0;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1296 spriv->frames = 0;
24904
75e930e20f48 repeat the PSM once every second (in terms of delta_scr) otherwise playing the file from the middle would miss the first instance
nicodvb
parents: 24903
diff changeset
1297 if(write_psm)
75e930e20f48 repeat the PSM once every second (in terms of delta_scr) otherwise playing the file from the middle would miss the first instance
nicodvb
parents: 24903
diff changeset
1298 priv->last_psm_scr = priv->scr;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1299
18192
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1300 return len;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1301 }
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1302
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1303 static inline int find_best_stream(muxer_t *muxer)
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1304 {
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1305 int i, ndts;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1306 uint64_t dts = -1;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1307 muxer_priv_t *priv = muxer->priv;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1308 muxer_headers_t *spriv;
18745
19cd9e0f8ac4 prevent buffer overflow in the STD; simplified fill_packet() (moving part of the code to get_packet_stats())
nicodvb
parents: 18558
diff changeset
1309 pack_stats_t p;
22929
a60dbae6ee1d added :interleaving2, a better method to determine which stream whouls be flushed
nicodvb
parents: 22927
diff changeset
1310 unsigned int perc, sperc;
18192
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1311
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1312 ndts = -1;
22929
a60dbae6ee1d added :interleaving2, a better method to determine which stream whouls be flushed
nicodvb
parents: 22927
diff changeset
1313 perc = -1;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1314
18745
19cd9e0f8ac4 prevent buffer overflow in the STD; simplified fill_packet() (moving part of the code to get_packet_stats())
nicodvb
parents: 18558
diff changeset
1315 //THIS RULE MUST ALWAYS apply: dts <= SCR + 0.7 seconds
18192
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1316 for(i = 0; i < muxer->avih.dwStreams; i++)
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1317 {
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1318 spriv = muxer->streams[i]->priv;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1319
18745
19cd9e0f8ac4 prevent buffer overflow in the STD; simplified fill_packet() (moving part of the code to get_packet_stats())
nicodvb
parents: 18558
diff changeset
1320 p.len = 0;
19cd9e0f8ac4 prevent buffer overflow in the STD; simplified fill_packet() (moving part of the code to get_packet_stats())
nicodvb
parents: 18558
diff changeset
1321 get_packet_stats(priv, muxer->streams[i], &p, 0);
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1322
18745
19cd9e0f8ac4 prevent buffer overflow in the STD; simplified fill_packet() (moving part of the code to get_packet_stats())
nicodvb
parents: 18558
diff changeset
1323 if(spriv->track_bufsize + p.len > spriv->max_buffer_size)
18192
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1324 continue;
18745
19cd9e0f8ac4 prevent buffer overflow in the STD; simplified fill_packet() (moving part of the code to get_packet_stats())
nicodvb
parents: 18558
diff changeset
1325 if(p.frame_pts && p.frame_dts > priv->scr + 63000*300)
18192
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1326 continue;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1327
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1328 if(spriv->framebuf[0].dts <= dts)
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1329 {
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1330 dts = spriv->framebuf[0].dts;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1331 ndts = i;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1332 }
22929
a60dbae6ee1d added :interleaving2, a better method to determine which stream whouls be flushed
nicodvb
parents: 22927
diff changeset
1333
a60dbae6ee1d added :interleaving2, a better method to determine which stream whouls be flushed
nicodvb
parents: 22927
diff changeset
1334 if(conf_interleaving2)
a60dbae6ee1d added :interleaving2, a better method to determine which stream whouls be flushed
nicodvb
parents: 22927
diff changeset
1335 {
a60dbae6ee1d added :interleaving2, a better method to determine which stream whouls be flushed
nicodvb
parents: 22927
diff changeset
1336 sperc = (spriv->track_bufsize * 1024) / spriv->max_buffer_size;
a60dbae6ee1d added :interleaving2, a better method to determine which stream whouls be flushed
nicodvb
parents: 22927
diff changeset
1337 if(sperc < perc)
a60dbae6ee1d added :interleaving2, a better method to determine which stream whouls be flushed
nicodvb
parents: 22927
diff changeset
1338 {
a60dbae6ee1d added :interleaving2, a better method to determine which stream whouls be flushed
nicodvb
parents: 22927
diff changeset
1339 ndts = i;
a60dbae6ee1d added :interleaving2, a better method to determine which stream whouls be flushed
nicodvb
parents: 22927
diff changeset
1340 perc = sperc;
a60dbae6ee1d added :interleaving2, a better method to determine which stream whouls be flushed
nicodvb
parents: 22927
diff changeset
1341 }
a60dbae6ee1d added :interleaving2, a better method to determine which stream whouls be flushed
nicodvb
parents: 22927
diff changeset
1342 }
18192
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1343 }
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1344
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1345 return ndts;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1346 }
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1347
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1348 static void patch_seq(muxer_priv_t *priv, unsigned char *buf)
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1349 {
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1350 if(priv->vwidth > 0)
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1351 {
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1352 buf[4] = (priv->vwidth >> 4) & 0xff;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1353 buf[5] &= 0x0f;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1354 buf[5] |= (priv->vwidth & 0x0f) << 4;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1355 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1356
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1357 if(priv->vheight > 0)
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1358 {
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1359 buf[5] &= 0xf0;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1360 buf[5] |= (priv->vheight >> 8) & 0x0f;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1361 buf[6] = priv->vheight & 0xff;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1362 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1363
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1364 if(priv->vaspect > 0)
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1365 buf[7] = (buf[7] & 0x0f) | (priv->vaspect << 4);
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1366
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1367 if(priv->vframerate > 0)
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1368 buf[7] = (buf[7] & 0xf0) | priv->vframerate;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1369
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1370 if(priv->vbitrate > 0)
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1371 {
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1372 buf[8] = (priv->vbitrate >> 10);
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1373 buf[9] = (priv->vbitrate >> 2);
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1374 buf[10] = (buf[10] & 0x3f) | (unsigned char) ((priv->vbitrate & 0x4) << 2);
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1375 }
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1376 }
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1377
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1378 static void patch_panscan(muxer_priv_t *priv, unsigned char *buf)
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1379 { //patches sequence display extension (display_horizontal_size and display_vertical_size)
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1380 //1:
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1381 int offset = 1;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1382
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1383 if(buf[0] & 0x01)
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1384 offset += 3;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1385
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1386 if(priv->panscan_width > 0)
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1387 {
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1388 buf[offset] = (priv->panscan_width >> 6);
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1389 buf[offset+1] = ((priv->panscan_width & 0x3F) << 2) | (buf[offset + 1] & 0x03);
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1390 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1391
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1392 offset++;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1393
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1394 if(priv->panscan_height > 0)
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1395 {
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1396 buf[offset] = (priv->panscan_height >> 13) << 7;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1397 buf[offset+1] = (priv->panscan_height >> 5) & 0xFF;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1398 buf[offset+2] = ((priv->panscan_height & 0x1F) << 3) | (buf[offset+2] & 0x07);
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1399 }
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1400 }
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1401
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1402
18196
f7f6984638f8 finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents: 18192
diff changeset
1403 static void update_scr(muxer_t *muxer)
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1404 {
18196
f7f6984638f8 finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents: 18192
diff changeset
1405 muxer_priv_t *priv = muxer->priv;
f7f6984638f8 finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents: 18192
diff changeset
1406 muxer_stream_t *stream;
f7f6984638f8 finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents: 18192
diff changeset
1407 muxer_headers_t *spriv;
f7f6984638f8 finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents: 18192
diff changeset
1408 int i, j;
f7f6984638f8 finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents: 18192
diff changeset
1409 uint64_t mindts = (uint64_t) -1;
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1410
18196
f7f6984638f8 finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents: 18192
diff changeset
1411 priv->scr += priv->delta_scr;
f7f6984638f8 finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents: 18192
diff changeset
1412
f7f6984638f8 finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents: 18192
diff changeset
1413 for(i = 0; i < muxer->avih.dwStreams; i++)
15947
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
1414 {
18196
f7f6984638f8 finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents: 18192
diff changeset
1415 stream = muxer->streams[i];
f7f6984638f8 finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents: 18192
diff changeset
1416 spriv = stream->priv;
f7f6984638f8 finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents: 18192
diff changeset
1417 if(spriv->framebuf_used && spriv->framebuf[0].dts < mindts)
f7f6984638f8 finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents: 18192
diff changeset
1418 mindts = spriv->framebuf[0].dts;
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1419 }
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1420
18196
f7f6984638f8 finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents: 18192
diff changeset
1421 mp_msg(MSGT_MUXER, MSGL_DBG2, "UPDATE SCR TO %"PRIu64" (%.3lf)\n", priv->scr, (double) (priv->scr/27000000.0));
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1422
18196
f7f6984638f8 finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents: 18192
diff changeset
1423 for(i = 0; i < muxer->avih.dwStreams; i++)
15947
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
1424 {
18196
f7f6984638f8 finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents: 18192
diff changeset
1425 stream = muxer->streams[i];
f7f6984638f8 finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents: 18192
diff changeset
1426 spriv = stream->priv;
15947
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
1427
18196
f7f6984638f8 finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents: 18192
diff changeset
1428 j = 0;
f7f6984638f8 finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents: 18192
diff changeset
1429 while(j < spriv->track_pos && priv->scr >= spriv->buffer_track[j].dts)
15947
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
1430 {
18196
f7f6984638f8 finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents: 18192
diff changeset
1431 spriv->track_bufsize -= spriv->buffer_track[j].size;
f7f6984638f8 finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents: 18192
diff changeset
1432 j++;
15947
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
1433 }
18196
f7f6984638f8 finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents: 18192
diff changeset
1434 if(spriv->track_bufsize < 0)
15947
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
1435 {
18196
f7f6984638f8 finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents: 18192
diff changeset
1436 double d;
f7f6984638f8 finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents: 18192
diff changeset
1437 muxer->sysrate = (muxer->sysrate * 11) / 10; //raise by 10%
f7f6984638f8 finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents: 18192
diff changeset
1438 d = (double) priv->packet_size / (double)muxer->sysrate;
f7f6984638f8 finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents: 18192
diff changeset
1439 priv->delta_scr = (uint64_t) (d * 27000000.0f);
23637
df9aa9eb9de6 Use proper PRI?64 format strings
reimar
parents: 22929
diff changeset
1440 mp_msg(MSGT_MUXER, MSGL_INFO, "\r\nBUFFER UNDEFLOW at stream %d, raising muxrate to %d kb/s, delta_scr: %"PRIu64"\r\n", i, muxer->sysrate/125, priv->delta_scr);
18196
f7f6984638f8 finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents: 18192
diff changeset
1441 spriv->track_bufsize = 0;
21448
24775c741a9a cosmetics: anti-chaos reindentation
nicodvb
parents: 21413
diff changeset
1442 }
15947
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
1443
18196
f7f6984638f8 finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents: 18192
diff changeset
1444 if(j > 0)
21448
24775c741a9a cosmetics: anti-chaos reindentation
nicodvb
parents: 21413
diff changeset
1445 {
18196
f7f6984638f8 finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents: 18192
diff changeset
1446 memmove(spriv->buffer_track, &(spriv->buffer_track[j]), (spriv->track_len - j) * sizeof(buffer_track_t));
f7f6984638f8 finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents: 18192
diff changeset
1447 spriv->track_pos -= j;
f7f6984638f8 finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents: 18192
diff changeset
1448 for(j = spriv->track_pos; j < spriv->track_len; j++)
f7f6984638f8 finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents: 18192
diff changeset
1449 spriv->buffer_track[j].size = 0;
21448
24775c741a9a cosmetics: anti-chaos reindentation
nicodvb
parents: 21413
diff changeset
1450 }
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1451
18196
f7f6984638f8 finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents: 18192
diff changeset
1452 if(spriv->framebuf_used && spriv->framebuf[0].dts < mindts)
f7f6984638f8 finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents: 18192
diff changeset
1453 mindts = spriv->framebuf[0].dts;
f7f6984638f8 finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents: 18192
diff changeset
1454 }
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1455 }
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1456
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1457
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1458 static int calc_frames_to_flush(muxer_headers_t *vpriv)
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1459 {
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1460 int n, found = 0;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1461
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1462 if(vpriv->framebuf_used > 0)
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1463 {
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1464 n = 0;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1465 //let's count how many frames we'll store in the next pack sequence
15278
a45c7e1b998f added support for AAC; moved most of MSGL_V to MSGL_DBG2 to reduce verbosity
nicodvb
parents: 15083
diff changeset
1466 mp_msg(MSGT_MUXER, MSGL_DBG2, "\n");
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1467 while(n < vpriv->framebuf_used)
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1468 {
18196
f7f6984638f8 finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents: 18192
diff changeset
1469 mp_msg(MSGT_MUXER, MSGL_DBG2, "CALC_FRAMES, n=%d, type=%c, pts=%.3lf\n", n, FTYPE(vpriv->framebuf[n].type), (double)vpriv->framebuf[n].pts/27000000.0f);
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1470 if(n+1 < vpriv->framebuf_used)
18196
f7f6984638f8 finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents: 18192
diff changeset
1471 mp_msg(MSGT_MUXER, MSGL_DBG2, "n+1=%d, type=%c, pts=%.3lf\n", n+1, FTYPE(vpriv->framebuf[n+1].type), (double)vpriv->framebuf[n+1].pts/27000000.0f);
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1472
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1473 if(vpriv->framebuf[n].type == I_FRAME)
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1474 {
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1475 if(n > 0)
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1476 {
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1477 found = 1;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1478 break;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1479 }
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1480 }
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1481
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1482 n++;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1483 }
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1484 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1485
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1486 if(found && (n < vpriv->framebuf_used+1))
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1487 return n;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1488 else
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1489 return 0;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1490 }
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1491
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1492 static int flush_buffers(muxer_t *muxer, int finalize)
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1493 {
18199
10eaea5b657d removed unused variables
nicodvb
parents: 18197
diff changeset
1494 int i, n, found;
10eaea5b657d removed unused variables
nicodvb
parents: 18197
diff changeset
1495 int skip_cnt;
10eaea5b657d removed unused variables
nicodvb
parents: 18197
diff changeset
1496 uint64_t init_delay = 0;
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1497 muxer_stream_t *s, *vs, *as;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1498 muxer_headers_t *vpriv = NULL, *apriv = NULL;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1499 muxer_priv_t *priv = (muxer_priv_t *) muxer->priv;
22909
94183c81ec0c reversed r22879 until I discover why it's giving so many sync problems; I'll eventually recommit it in a fixed form
nicodvb
parents: 22881
diff changeset
1500 double duration;
94183c81ec0c reversed r22879 until I discover why it's giving so many sync problems; I'll eventually recommit it in a fixed form
nicodvb
parents: 22881
diff changeset
1501 uint64_t iduration, iaduration;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1502
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1503 /*
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1504 analyzes all streams and decides what to flush
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1505 trying to respect an interleaving distribution
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1506 equal to the v_bitrate/a_bitrate proportion
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1507 */
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1508 n = 0;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1509 vs = as = NULL;
18196
f7f6984638f8 finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents: 18192
diff changeset
1510 found = 0;
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1511 for(i = 0; i < muxer->avih.dwStreams; i++)
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1512 {
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1513 s = muxer->streams[i];
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1514 if(s->type == MUXER_TYPE_VIDEO)
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1515 {
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1516 vs = muxer->streams[i];
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1517 vpriv = (muxer_headers_t*) vs->priv;
18181
afaa492536f6 new code to simplify assignment of timestamps; removed temp_ref from mpeg_frame_t and modified add_frame() accordingly; removed no more used drop_delayed_audio() and save_delayed_audio()
nicodvb
parents: 18166
diff changeset
1518 if(!vpriv->is_ready)
afaa492536f6 new code to simplify assignment of timestamps; removed temp_ref from mpeg_frame_t and modified add_frame() accordingly; removed no more used drop_delayed_audio() and save_delayed_audio()
nicodvb
parents: 18166
diff changeset
1519 return 0;
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1520 n = found = calc_frames_to_flush(vpriv);
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1521 }
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1522 else if(s->type == MUXER_TYPE_AUDIO)
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1523 as = s;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1524 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1525
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1526 if((! found) && finalize)
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1527 {
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1528 if(vpriv != NULL)
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1529 found = n = vpriv->framebuf_used;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1530 }
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1531
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1532 if(found)
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1533 {
15278
a45c7e1b998f added support for AAC; moved most of MSGL_V to MSGL_DBG2 to reduce verbosity
nicodvb
parents: 15083
diff changeset
1534 mp_msg(MSGT_MUXER, MSGL_DBG2, "\nVIDEO, FLUSH %d frames (of %d), 0 to %d\n", n, vpriv->framebuf_used, n-1);
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1535
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1536 vpriv = (muxer_headers_t*) vs->priv;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1537
22909
94183c81ec0c reversed r22879 until I discover why it's giving so many sync problems; I'll eventually recommit it in a fixed form
nicodvb
parents: 22881
diff changeset
1538 duration = 0;
94183c81ec0c reversed r22879 until I discover why it's giving so many sync problems; I'll eventually recommit it in a fixed form
nicodvb
parents: 22881
diff changeset
1539 iduration = 0;
94183c81ec0c reversed r22879 until I discover why it's giving so many sync problems; I'll eventually recommit it in a fixed form
nicodvb
parents: 22881
diff changeset
1540 for(i = 0; i < n; i++)
94183c81ec0c reversed r22879 until I discover why it's giving so many sync problems; I'll eventually recommit it in a fixed form
nicodvb
parents: 22881
diff changeset
1541 iduration += vpriv->framebuf[i].idur;
94183c81ec0c reversed r22879 until I discover why it's giving so many sync problems; I'll eventually recommit it in a fixed form
nicodvb
parents: 22881
diff changeset
1542 duration = (double) (iduration / 27000000.0);
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1543
22909
94183c81ec0c reversed r22879 until I discover why it's giving so many sync problems; I'll eventually recommit it in a fixed form
nicodvb
parents: 22881
diff changeset
1544 if(as != NULL)
94183c81ec0c reversed r22879 until I discover why it's giving so many sync problems; I'll eventually recommit it in a fixed form
nicodvb
parents: 22881
diff changeset
1545 {
94183c81ec0c reversed r22879 until I discover why it's giving so many sync problems; I'll eventually recommit it in a fixed form
nicodvb
parents: 22881
diff changeset
1546 apriv = (muxer_headers_t*) as->priv;
94183c81ec0c reversed r22879 until I discover why it's giving so many sync problems; I'll eventually recommit it in a fixed form
nicodvb
parents: 22881
diff changeset
1547 iaduration = 0;
94183c81ec0c reversed r22879 until I discover why it's giving so many sync problems; I'll eventually recommit it in a fixed form
nicodvb
parents: 22881
diff changeset
1548 for(i = 0; i < apriv->framebuf_used; i++)
94183c81ec0c reversed r22879 until I discover why it's giving so many sync problems; I'll eventually recommit it in a fixed form
nicodvb
parents: 22881
diff changeset
1549 {
94183c81ec0c reversed r22879 until I discover why it's giving so many sync problems; I'll eventually recommit it in a fixed form
nicodvb
parents: 22881
diff changeset
1550 iaduration += apriv->framebuf[i].idur;
94183c81ec0c reversed r22879 until I discover why it's giving so many sync problems; I'll eventually recommit it in a fixed form
nicodvb
parents: 22881
diff changeset
1551 }
94183c81ec0c reversed r22879 until I discover why it's giving so many sync problems; I'll eventually recommit it in a fixed form
nicodvb
parents: 22881
diff changeset
1552 if(iaduration < iduration)
94183c81ec0c reversed r22879 until I discover why it's giving so many sync problems; I'll eventually recommit it in a fixed form
nicodvb
parents: 22881
diff changeset
1553 {
94183c81ec0c reversed r22879 until I discover why it's giving so many sync problems; I'll eventually recommit it in a fixed form
nicodvb
parents: 22881
diff changeset
1554 mp_msg(MSGT_MUXER, MSGL_DBG2, "Not enough audio data exit\n");
94183c81ec0c reversed r22879 until I discover why it's giving so many sync problems; I'll eventually recommit it in a fixed form
nicodvb
parents: 22881
diff changeset
1555 return 0;
94183c81ec0c reversed r22879 until I discover why it's giving so many sync problems; I'll eventually recommit it in a fixed form
nicodvb
parents: 22881
diff changeset
1556 }
94183c81ec0c reversed r22879 until I discover why it's giving so many sync problems; I'll eventually recommit it in a fixed form
nicodvb
parents: 22881
diff changeset
1557 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1558
22861
a9b5d1ddbd80 in flush_buffers() removed code that required the presence of an amount of audio data >= video data in the temporal domain
nicodvb
parents: 22605
diff changeset
1559 if(as != NULL && (apriv->size == 0))
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1560 {
18196
f7f6984638f8 finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents: 18192
diff changeset
1561 init_delay = vpriv->framebuf[0].pts - vpriv->framebuf[0].dts;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1562
18196
f7f6984638f8 finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents: 18192
diff changeset
1563 for(i = 0; i < apriv->framebuf_cnt; i++)
21448
24775c741a9a cosmetics: anti-chaos reindentation
nicodvb
parents: 21413
diff changeset
1564 {
18196
f7f6984638f8 finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents: 18192
diff changeset
1565 apriv->framebuf[i].pts += init_delay;
f7f6984638f8 finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents: 18192
diff changeset
1566 apriv->framebuf[i].dts += init_delay;
f7f6984638f8 finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents: 18192
diff changeset
1567 }
f7f6984638f8 finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents: 18192
diff changeset
1568 apriv->last_pts += init_delay;
f7f6984638f8 finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents: 18192
diff changeset
1569 mp_msg(MSGT_MUXER, MSGL_DBG2, "\r\nINITIAL VIDEO DELAY: %.3lf, currAPTS: %.3lf\r\n", (double) init_delay/27000000.0f, (double) apriv->last_pts/27000000.0f);
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1570 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1571
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1572 if((priv->is_xvcd || priv->is_xsvcd) && (vpriv->size == 0))
21413
06d63614eeaa permit to specify the sizes of the decoders' buffers
nicodvb
parents: 21372
diff changeset
1573 vpriv->buffer_size = (conf_vbuf_size ? conf_vbuf_size : (priv->is_xvcd ? 46 : 230))*1024;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1574
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1575 i = 0;
18196
f7f6984638f8 finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents: 18192
diff changeset
1576 skip_cnt = 0;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1577
18196
f7f6984638f8 finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents: 18192
diff changeset
1578 while(1)
f7f6984638f8 finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents: 18192
diff changeset
1579 {
f7f6984638f8 finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents: 18192
diff changeset
1580 update_scr(muxer);
f7f6984638f8 finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents: 18192
diff changeset
1581 i = find_best_stream(muxer);
f7f6984638f8 finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents: 18192
diff changeset
1582 if(i < 0)
f7f6984638f8 finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents: 18192
diff changeset
1583 continue;
f7f6984638f8 finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents: 18192
diff changeset
1584 if(!fill_packet(muxer, muxer->streams[i], finalize))
f7f6984638f8 finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents: 18192
diff changeset
1585 skip_cnt++;
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1586
18196
f7f6984638f8 finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents: 18192
diff changeset
1587 if(skip_cnt == muxer->avih.dwStreams)
20344
5ccb2b837b1c if no stream could be muxed flush_buffers() returns 0: prevents while(1) stall at the end
nicodvb
parents: 20153
diff changeset
1588 {
5ccb2b837b1c if no stream could be muxed flush_buffers() returns 0: prevents while(1) stall at the end
nicodvb
parents: 20153
diff changeset
1589 found = 0;
18196
f7f6984638f8 finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents: 18192
diff changeset
1590 break;
20344
5ccb2b837b1c if no stream could be muxed flush_buffers() returns 0: prevents while(1) stall at the end
nicodvb
parents: 20153
diff changeset
1591 }
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1592 }
18196
f7f6984638f8 finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents: 18192
diff changeset
1593 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1594
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1595 muxer->file_end = priv->scr;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1596 return found;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1597 }
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1598
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1599
18161
516d7874450b changed timebase from 1024 to 300 (no rounding errors with any of the allowed framerates); write scr_extension accordingly. This is the first of a long series of patches to rewrite the muxer
nicodvb
parents: 18044
diff changeset
1600 static inline uint64_t parse_fps(float fps)
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1601 {
18161
516d7874450b changed timebase from 1024 to 300 (no rounding errors with any of the allowed framerates); write scr_extension accordingly. This is the first of a long series of patches to rewrite the muxer
nicodvb
parents: 18044
diff changeset
1602 // 90000 * 300 * 1001 / d , there's no rounding error with any of the admitted framerates
516d7874450b changed timebase from 1024 to 300 (no rounding errors with any of the allowed framerates); write scr_extension accordingly. This is the first of a long series of patches to rewrite the muxer
nicodvb
parents: 18044
diff changeset
1603 int d = (int)(fps*1001+0.5);
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1604
18161
516d7874450b changed timebase from 1024 to 300 (no rounding errors with any of the allowed framerates); write scr_extension accordingly. This is the first of a long series of patches to rewrite the muxer
nicodvb
parents: 18044
diff changeset
1605 return 27027000000ULL / d;
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1606 }
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1607
14880
991f5a7b1b7d telecine now works in display order (rather than decoding), as far as there are no more than 4 consecutive b-frames; added support for FMP4
nicodvb
parents: 14840
diff changeset
1608
21467
dd765bcd83aa added generalized teleciner by Donald Graft
nicodvb
parents: 21448
diff changeset
1609 static int soft_telecine(muxer_priv_t *priv, muxer_headers_t *vpriv, uint8_t *fps_ptr, uint8_t *se_ptr, uint8_t *pce_ptr, int n)
14840
d49482c5d8ac soft telecine support! :)) patch by nico
rfelker
parents: 14809
diff changeset
1610 {
17814
8f2e94a4a4c1 check pce_ptr before using it; fixes cid 207
nicodvb
parents: 17603
diff changeset
1611 if(! pce_ptr)
8f2e94a4a4c1 check pce_ptr before using it; fixes cid 207
nicodvb
parents: 17603
diff changeset
1612 return 0;
14840
d49482c5d8ac soft telecine support! :)) patch by nico
rfelker
parents: 14809
diff changeset
1613 if(fps_ptr != NULL)
d49482c5d8ac soft telecine support! :)) patch by nico
rfelker
parents: 14809
diff changeset
1614 {
21484
af37e86b635f cosmetics
nicodvb
parents: 21483
diff changeset
1615 *fps_ptr = (*fps_ptr & 0xf0) | priv->vframerate;
af37e86b635f cosmetics
nicodvb
parents: 21483
diff changeset
1616 vpriv->nom_delta_pts = parse_fps(conf_vframerate);
14840
d49482c5d8ac soft telecine support! :)) patch by nico
rfelker
parents: 14809
diff changeset
1617 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1618
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1619 //in pce_ptr starting from bit 0 bit 24 is tff, bit 30 is rff,
14840
d49482c5d8ac soft telecine support! :)) patch by nico
rfelker
parents: 14809
diff changeset
1620 if(pce_ptr[3] & 0x2)
d49482c5d8ac soft telecine support! :)) patch by nico
rfelker
parents: 14809
diff changeset
1621 {
d49482c5d8ac soft telecine support! :)) patch by nico
rfelker
parents: 14809
diff changeset
1622 mp_msg(MSGT_MUXER, MSGL_ERR, "\nERROR! RFF bit is already set, disabling telecining\n");
d49482c5d8ac soft telecine support! :)) patch by nico
rfelker
parents: 14809
diff changeset
1623 vpriv->telecine = 0;
d49482c5d8ac soft telecine support! :)) patch by nico
rfelker
parents: 14809
diff changeset
1624 return 0;
d49482c5d8ac soft telecine support! :)) patch by nico
rfelker
parents: 14809
diff changeset
1625 }
14880
991f5a7b1b7d telecine now works in display order (rather than decoding), as far as there are no more than 4 consecutive b-frames; added support for FMP4
nicodvb
parents: 14840
diff changeset
1626
14894
bd6d709d13fb recalculate frame duration after soft telecine
nicodvb
parents: 14881
diff changeset
1627 vpriv->picture.progressive_sequence = 0;
bd6d709d13fb recalculate frame duration after soft telecine
nicodvb
parents: 14881
diff changeset
1628 vpriv->picture.progressive_frame = 1;
14880
991f5a7b1b7d telecine now works in display order (rather than decoding), as far as there are no more than 4 consecutive b-frames; added support for FMP4
nicodvb
parents: 14840
diff changeset
1629 if(se_ptr)
991f5a7b1b7d telecine now works in display order (rather than decoding), as far as there are no more than 4 consecutive b-frames; added support for FMP4
nicodvb
parents: 14840
diff changeset
1630 se_ptr[1] &= 0xf7;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1631
24630
dcba95743b2f 1000l, the tff flag was never cleared before being overwritten with the value on bff_mask;
nicodvb
parents: 23637
diff changeset
1632 //disable tff and rff and overwrite them with the value in bff_mask
25720
333540254bb4 Put bff_mask into muxer context instead of a global variable.
reimar
parents: 25098
diff changeset
1633 pce_ptr[3] = (pce_ptr[3] & 0x7d) | priv->bff_mask[vpriv->display_frame % MAX_PATTERN_LENGTH];
17600
6fa1149d8c80 experimental film2pal and ntsc2pal soft teleciner
nicodvb
parents: 17591
diff changeset
1634 pce_ptr[4] |= 0x80; //sets progressive frame
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1635
21467
dd765bcd83aa added generalized teleciner by Donald Graft
nicodvb
parents: 21448
diff changeset
1636 vpriv->display_frame += n;
14840
d49482c5d8ac soft telecine support! :)) patch by nico
rfelker
parents: 14809
diff changeset
1637 if(! vpriv->vframes)
21483
e065bb0c5485 removed dead code
nicodvb
parents: 21482
diff changeset
1638 mp_msg(MSGT_MUXER, MSGL_INFO, "\nENABLED SOFT TELECINING, FPS=%.3f\n",conf_vframerate);
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1639
14840
d49482c5d8ac soft telecine support! :)) patch by nico
rfelker
parents: 14809
diff changeset
1640 return 1;
d49482c5d8ac soft telecine support! :)) patch by nico
rfelker
parents: 14809
diff changeset
1641 }
d49482c5d8ac soft telecine support! :)) patch by nico
rfelker
parents: 14809
diff changeset
1642
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1643 static size_t parse_mpeg12_video(muxer_stream_t *s, muxer_priv_t *priv, muxer_headers_t *spriv, float fps, size_t len)
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1644 {
14840
d49482c5d8ac soft telecine support! :)) patch by nico
rfelker
parents: 14809
diff changeset
1645 uint8_t *fps_ptr = NULL; //pointer to the fps byte in the sequence header
d49482c5d8ac soft telecine support! :)) patch by nico
rfelker
parents: 14809
diff changeset
1646 uint8_t *se_ptr = NULL; //pointer to sequence extension
d49482c5d8ac soft telecine support! :)) patch by nico
rfelker
parents: 14809
diff changeset
1647 uint8_t *pce_ptr = NULL; //pointer to picture coding extension
17066
e84e5e9e9ef4 fixed wrong telecine trf pattern; fall back to mpeg2 when user specifies unknown format
nicodvb
parents: 17065
diff changeset
1648 int frames_diff, d1, gop_reset = 0; //how any frames we advanced respect to the last one
18181
afaa492536f6 new code to simplify assignment of timestamps; removed temp_ref from mpeg_frame_t and modified add_frame() accordingly; removed no more used drop_delayed_audio() and save_delayed_audio()
nicodvb
parents: 18166
diff changeset
1649 int ret;
22330
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1650 int i, err;
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1651 uint32_t temp_ref;
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1652 int pt;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1653
15278
a45c7e1b998f added support for AAC; moved most of MSGL_V to MSGL_DBG2 to reduce verbosity
nicodvb
parents: 15083
diff changeset
1654 mp_msg(MSGT_MUXER, MSGL_DBG2,"parse_mpeg12_video, len=%u\n", (uint32_t) len);
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1655 if(s->buffer[0] != 0 || s->buffer[1] != 0 || s->buffer[2] != 1 || len<6)
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1656 {
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1657 mp_msg(MSGT_MUXER, MSGL_ERR,"Unknown video format, possibly non-MPEG1/2 stream, len=%d!\n", len);
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1658 return 0;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1659 }
22330
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1660
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1661 temp_ref = 0;
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1662 pt = 0;
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1663 err = 0;
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1664 i = 0;
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1665 while(i + 4 < len)
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1666 { // Video (0) Sequence header (b3) or GOP (b8)
22330
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1667 if((s->buffer[i] == 0) && (s->buffer[i+1] == 0) && (s->buffer[i+2] == 1))
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1668 {
22330
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1669 switch(s->buffer[i+3])
14840
d49482c5d8ac soft telecine support! :)) patch by nico
rfelker
parents: 14809
diff changeset
1670 {
22330
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1671 case 0xb3: //sequence
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1672 {
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1673 if(i + 11 > len)
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1674 {
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1675 err=1;
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1676 break;
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1677 }
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1678 fps_ptr = &(s->buffer[i+7]);
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1679 mp_header_process_sequence_header(&(spriv->picture), &(s->buffer[i+4]));
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1680 spriv->delta_pts = spriv->nom_delta_pts = parse_fps(spriv->picture.fps);
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1681
22330
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1682 spriv->delta_clock = (double) 1/fps;
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1683 //the 2 lines below are needed to handle non-standard frame rates (such as 18)
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1684 if(! spriv->delta_pts)
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1685 spriv->delta_pts = spriv->nom_delta_pts = (uint64_t) ((double)27000000.0 * spriv->delta_clock );
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1686 mp_msg(MSGT_MUXER, MSGL_DBG2, "\nFPS: %.3f, FRAMETIME: %.3lf\n", fps, (double)1/fps);
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1687 if(priv->patch_seq)
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1688 patch_seq(priv, &(s->buffer[i]));
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1689 }
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1690 break;
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1691
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1692 case 0xb5:
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1693 if(i + 9 > len)
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1694 {
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1695 err = 1;
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1696 break;
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1697 }
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1698 mp_header_process_extension(&(spriv->picture), &(s->buffer[i+4]));
24630
dcba95743b2f 1000l, the tff flag was never cleared before being overwritten with the value on bff_mask;
nicodvb
parents: 23637
diff changeset
1699 if(((s->buffer[i+4] & 0xf0) == 0x10))
dcba95743b2f 1000l, the tff flag was never cleared before being overwritten with the value on bff_mask;
nicodvb
parents: 23637
diff changeset
1700 se_ptr = &(s->buffer[i+4]);
22330
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1701 if(((s->buffer[i+4] & 0xf0) == 0x20))
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1702 {
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1703 if(priv->patch_sde)
24631
f61c325bca3c fixed bug introduced with previous commit: patch_panscan() must work in the sequence_display_extension, not on se_ptr
nicodvb
parents: 24630
diff changeset
1704 patch_panscan(priv, &(s->buffer[i+4]));
22330
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1705 }
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1706 if((s->buffer[i+4] & 0xf0) == 0x80)
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1707 {
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1708 pce_ptr = &(s->buffer[i+4]);
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1709 }
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1710 break;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1711
22330
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1712 case 0xb8:
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1713 gop_reset = 1;
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1714 break;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1715
22330
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1716 case 0x00:
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1717 if(i + 5 > len)
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1718 {
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1719 err = 1;
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1720 break;
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1721 }
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1722 pt = (s->buffer[i+5] & 0x1c) >> 3;
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1723 temp_ref = (s->buffer[i+4]<<2)+(s->buffer[i+5]>>6);
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1724 break;
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1725 }
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1726 if(err) break; //something went wrong
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1727 if(s->buffer[i+3] >= 0x01 && s->buffer[i+3] <= 0xAF) break; //slice, we have already analized what we need
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1728 }
22330
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1729 i++;
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1730 }
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1731 if(err)
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1732 mp_msg(MSGT_MUXER, MSGL_ERR,"Warning: picture too short or broken!\n");
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1733
22332
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1734 //following 2 lines are workaround: lavf doesn't sync to sequence headers before passing demux_packets
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1735 if(!spriv->nom_delta_pts)
22332
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1736 spriv->delta_pts = spriv->nom_delta_pts = parse_fps(fps);
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1737 if(!spriv->vframes)
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1738 spriv->last_tr = spriv->max_tr = temp_ref;
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1739 d1 = temp_ref - spriv->last_tr;
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1740 if(gop_reset)
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1741 frames_diff = spriv->max_tr + 1 + temp_ref - spriv->last_tr;
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1742 else
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1743 {
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1744 if(d1 < -6) //there's a wraparound
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1745 frames_diff = spriv->max_tr + 1 + temp_ref - spriv->last_tr;
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1746 else if(d1 > 6) //there's a wraparound
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1747 frames_diff = spriv->max_tr + 1 + spriv->last_tr - temp_ref;
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1748 else if(!d1) //pre-emptive fix against broken sequences
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1749 frames_diff = 1;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1750 else
22332
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1751 frames_diff = d1;
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1752 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1753 mp_msg(MSGT_MUXER, MSGL_DBG2, "\nLAST: %d, TR: %d, GOP: %d, DIFF: %d, MAX: %d, d1: %d\n",
22332
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1754 spriv->last_tr, temp_ref, gop_reset, frames_diff, spriv->max_tr, d1);
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1755
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1756 if(temp_ref > spriv->max_tr || gop_reset)
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1757 spriv->max_tr = temp_ref;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1758
22332
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1759 spriv->last_tr = temp_ref;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1760 if(spriv->picture.mpeg1 == 0)
22332
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1761 {
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1762 if(spriv->telecine && pce_ptr)
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1763 {
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1764 soft_telecine(priv, spriv, fps_ptr, se_ptr, pce_ptr, frames_diff);
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1765 spriv->picture.display_time = 100;
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1766 mp_header_process_extension(&(spriv->picture), pce_ptr);
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1767 if(spriv->picture.display_time >= 50 && spriv->picture.display_time <= 300)
22332
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1768 spriv->delta_pts = (spriv->nom_delta_pts * spriv->picture.display_time) / 100;
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1769 }
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1770 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1771
22332
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1772 if(! spriv->vframes)
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1773 frames_diff = 1;
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1774
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1775 spriv->last_dts += spriv->delta_pts;
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1776 spriv->last_pts += spriv->nom_delta_pts*(frames_diff-1) + spriv->delta_pts;
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1777
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1778 ret = add_frame(spriv, spriv->delta_pts, s->buffer, len, pt, spriv->last_dts, spriv->last_pts);
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1779 if(ret < 0)
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1780 {
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1781 mp_msg(MSGT_MUXER, MSGL_FATAL, "\r\nPARSE_MPEG12: add_frames(%d) failed, exit\r\n", len);
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1782 return 0;
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1783 }
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1784 mp_msg(MSGT_MUXER, MSGL_DBG2, "\r\nVIDEO FRAME, PT: %C, tr: %d, diff: %d, dts: %.3lf, pts: %.3lf, pdt: %u, gop_reset: %d\r\n",
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1785 ftypes[pt], temp_ref, frames_diff, ((double) spriv->last_dts/27000000.0f),
22332
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1786 ((double) spriv->last_pts/27000000.0f), spriv->picture.display_time, gop_reset);
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1787
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1788 if(pt == B_FRAME)
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1789 {
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1790 int j, n, adj = 0;
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1791 int64_t diff = spriv->last_dts - spriv->last_pts;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1792
22332
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1793 if(diff != 0)
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1794 {
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1795 n = spriv->framebuf_used - 1;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1796
22332
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1797 for(j = n; j >= 0; j--)
17066
e84e5e9e9ef4 fixed wrong telecine trf pattern; fall back to mpeg2 when user specifies unknown format
nicodvb
parents: 17065
diff changeset
1798 {
22332
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1799 if(spriv->framebuf[j].pts >= spriv->last_pts)
14894
bd6d709d13fb recalculate frame duration after soft telecine
nicodvb
parents: 14881
diff changeset
1800 {
22332
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1801 spriv->framebuf[j].pts += diff;
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1802 adj++;
14894
bd6d709d13fb recalculate frame duration after soft telecine
nicodvb
parents: 14881
diff changeset
1803 }
bd6d709d13fb recalculate frame duration after soft telecine
nicodvb
parents: 14881
diff changeset
1804 }
23637
df9aa9eb9de6 Use proper PRI?64 format strings
reimar
parents: 22929
diff changeset
1805 mp_msg(MSGT_MUXER, MSGL_V, "\r\nResynced B-frame by %d units, DIFF: %"PRId64" (%.3lf),[pd]ts=%.3lf\r\n",
22332
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1806 n, diff, (double) diff/27000000.0f, (double) spriv->last_pts/27000000.0f);
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1807 spriv->last_pts = spriv->last_dts;
18181
afaa492536f6 new code to simplify assignment of timestamps; removed temp_ref from mpeg_frame_t and modified add_frame() accordingly; removed no more used drop_delayed_audio() and save_delayed_audio()
nicodvb
parents: 18166
diff changeset
1808 }
22332
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1809 }
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1810 spriv->vframes++;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1811
15278
a45c7e1b998f added support for AAC; moved most of MSGL_V to MSGL_DBG2 to reduce verbosity
nicodvb
parents: 15083
diff changeset
1812 mp_msg(MSGT_MUXER, MSGL_DBG2,"parse_mpeg12_video, return %u\n", (uint32_t) len);
18166
e952e8cdf98e removed useless (and broken as hell) buffering code from muxer1; buffering constraints will be fully respected when one of the forthcoming patches is applied
nicodvb
parents: 18165
diff changeset
1813 return len;
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1814 }
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1815
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1816
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1817 static uint64_t fix_mp4_frame_duration(muxer_headers_t *vpriv)
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1818 {
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1819 uint64_t mn, md, mx, diff;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1820 uint32_t i;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1821
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1822 mn = mx = vpriv->framebuf[0].pts;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1823 for(i = 0; i < 3; i++)
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1824 {
16750
0a31740dd5e6 Use PRI?64 defines as format strings for 64 bit variables.
reimar
parents: 16192
diff changeset
1825 mp_msg(MSGT_DECVIDEO,MSGL_DBG2, "PTS: %"PRIu64"\n", vpriv->framebuf[i].pts);
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1826 if(vpriv->framebuf[i].pts < mn)
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1827 mn = vpriv->framebuf[i].pts;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1828 if(vpriv->framebuf[i].pts > mx)
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1829 mx = vpriv->framebuf[i].pts;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1830 }
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1831 md = mn;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1832 for(i=0; i<3; i++)
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1833 {
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1834 if((vpriv->framebuf[i].pts > mn) && (vpriv->framebuf[i].pts < mx))
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1835 md = vpriv->framebuf[i].pts;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1836 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1837
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1838 if(mx - md > md - mn)
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1839 diff = md - mn;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1840 else
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1841 diff = mx - md;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1842
18181
afaa492536f6 new code to simplify assignment of timestamps; removed temp_ref from mpeg_frame_t and modified add_frame() accordingly; removed no more used drop_delayed_audio() and save_delayed_audio()
nicodvb
parents: 18166
diff changeset
1843 mp_msg(MSGT_DECVIDEO,MSGL_DBG2, "MIN: %"PRIu64", mid: %"PRIu64", max: %"PRIu64", diff: %"PRIu64"\n", mn, md, mx, diff);
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1844 if(diff > 0)
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1845 {
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1846 for(i=0; i<3; i++)
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1847 {
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1848 vpriv->framebuf[i].pts += diff;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1849 vpriv->framebuf[i].dts += i * diff;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1850 mp_msg(MSGT_MUXER, MSGL_DBG2, "FIXED_PTS: %.3lf, FIXED_DTS: %.3lf\n",
18161
516d7874450b changed timebase from 1024 to 300 (no rounding errors with any of the allowed framerates); write scr_extension accordingly. This is the first of a long series of patches to rewrite the muxer
nicodvb
parents: 18044
diff changeset
1851 (double) (vpriv->framebuf[i].pts/27000000.0), (double) (vpriv->framebuf[i].dts/27000000.0));
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1852 }
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1853 return diff;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1854 }
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1855 else
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1856 return 0;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1857 }
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1858
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1859
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1860 static size_t parse_mpeg4_video(muxer_stream_t *s, muxer_priv_t *priv, muxer_headers_t *vpriv, float fps, size_t len)
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1861 {
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1862 size_t ptr = 0;
17815
36a155ee4d27 init delta_pts before using it; fixes cid 239
nicodvb
parents: 17814
diff changeset
1863 int64_t delta_pts=0;
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1864 uint8_t pt;
18181
afaa492536f6 new code to simplify assignment of timestamps; removed temp_ref from mpeg_frame_t and modified add_frame() accordingly; removed no more used drop_delayed_audio() and save_delayed_audio()
nicodvb
parents: 18166
diff changeset
1865 int ret;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1866
15278
a45c7e1b998f added support for AAC; moved most of MSGL_V to MSGL_DBG2 to reduce verbosity
nicodvb
parents: 15083
diff changeset
1867 mp_msg(MSGT_MUXER, MSGL_DBG2,"parse_mpeg4_video, len=%u\n", (uint32_t) len);
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1868 if(len<6)
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1869 {
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1870 mp_msg(MSGT_MUXER, MSGL_ERR,"Frame too short: %d, exit!\n", len);
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1871 return 0;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1872 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1873
18181
afaa492536f6 new code to simplify assignment of timestamps; removed temp_ref from mpeg_frame_t and modified add_frame() accordingly; removed no more used drop_delayed_audio() and save_delayed_audio()
nicodvb
parents: 18166
diff changeset
1874 pt = 0;
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1875 while(ptr < len - 5)
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1876 {
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1877 if(s->buffer[ptr] != 0 || s->buffer[ptr+1] != 0 || s->buffer[ptr+2] != 1)
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1878 {
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1879 ptr++;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1880 continue;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1881 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1882
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1883 if(s->buffer[ptr+3] >= 0x20 && s->buffer[ptr+3] <= 0x2f) //VOL
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1884 {
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1885 mp4_header_process_vol(&(vpriv->picture), &(s->buffer[ptr+4]));
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1886 }
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1887 else if(s->buffer[ptr+3] == 0xb3) //gov
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1888 {
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1889 //fprintf(stderr, "\nGOV\n");
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1890 }
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1891 else if(s->buffer[ptr+3] == 0xb6) //vop
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1892 {
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1893 int32_t delta;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1894 mp4_header_process_vop(&(vpriv->picture), &(s->buffer[ptr+4]));
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1895
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1896 delta = vpriv->picture.timeinc_unit - vpriv->last_tr;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1897 if((delta > 0) && (delta > (vpriv->picture.timeinc_resolution/2)))
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1898 delta -= vpriv->picture.timeinc_resolution;
18163
1e4caa08161d fixed wrong operator precedence in parse_mpeg4_video()
nicodvb
parents: 18162
diff changeset
1899 else if((delta < 0) && (delta < (-(vpriv->picture.timeinc_resolution/2))))
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1900 delta += vpriv->picture.timeinc_resolution;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1901
18161
516d7874450b changed timebase from 1024 to 300 (no rounding errors with any of the allowed framerates); write scr_extension accordingly. This is the first of a long series of patches to rewrite the muxer
nicodvb
parents: 18044
diff changeset
1902 delta_pts = (27000000 * (int64_t) delta) / vpriv->picture.timeinc_resolution;
18181
afaa492536f6 new code to simplify assignment of timestamps; removed temp_ref from mpeg_frame_t and modified add_frame() accordingly; removed no more used drop_delayed_audio() and save_delayed_audio()
nicodvb
parents: 18166
diff changeset
1903 //warning, it seems that packed bops can lead to delta == 0
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1904
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1905 pt = vpriv->picture.picture_type + 1;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1906 mp_msg(MSGT_MUXER, MSGL_DBG2, "\nTYPE: %c, RESOLUTION: %d, TEMP: %d, delta: %d, delta_pts: %"PRId64" = %.3lf, delta2: %.3lf\n",
18161
516d7874450b changed timebase from 1024 to 300 (no rounding errors with any of the allowed framerates); write scr_extension accordingly. This is the first of a long series of patches to rewrite the muxer
nicodvb
parents: 18044
diff changeset
1907 FTYPE(pt), vpriv->picture.timeinc_resolution, vpriv->picture.timeinc_unit, delta, delta_pts, (double) (delta_pts/27000000.0),
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1908 (double) delta / (double) vpriv->picture.timeinc_resolution);
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1909
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1910 vpriv->last_tr = vpriv->picture.timeinc_unit;
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1911
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1912 break;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1913 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1914
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1915 ptr++;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1916 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1917
18181
afaa492536f6 new code to simplify assignment of timestamps; removed temp_ref from mpeg_frame_t and modified add_frame() accordingly; removed no more used drop_delayed_audio() and save_delayed_audio()
nicodvb
parents: 18166
diff changeset
1918 if(vpriv->vframes)
afaa492536f6 new code to simplify assignment of timestamps; removed temp_ref from mpeg_frame_t and modified add_frame() accordingly; removed no more used drop_delayed_audio() and save_delayed_audio()
nicodvb
parents: 18166
diff changeset
1919 {
afaa492536f6 new code to simplify assignment of timestamps; removed temp_ref from mpeg_frame_t and modified add_frame() accordingly; removed no more used drop_delayed_audio() and save_delayed_audio()
nicodvb
parents: 18166
diff changeset
1920 vpriv->last_dts += vpriv->frame_duration;
afaa492536f6 new code to simplify assignment of timestamps; removed temp_ref from mpeg_frame_t and modified add_frame() accordingly; removed no more used drop_delayed_audio() and save_delayed_audio()
nicodvb
parents: 18166
diff changeset
1921 vpriv->last_pts += delta_pts;
afaa492536f6 new code to simplify assignment of timestamps; removed temp_ref from mpeg_frame_t and modified add_frame() accordingly; removed no more used drop_delayed_audio() and save_delayed_audio()
nicodvb
parents: 18166
diff changeset
1922 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1923
18181
afaa492536f6 new code to simplify assignment of timestamps; removed temp_ref from mpeg_frame_t and modified add_frame() accordingly; removed no more used drop_delayed_audio() and save_delayed_audio()
nicodvb
parents: 18166
diff changeset
1924 ret = add_frame(vpriv, delta_pts, s->buffer, len, pt, vpriv->last_dts, vpriv->last_pts);
afaa492536f6 new code to simplify assignment of timestamps; removed temp_ref from mpeg_frame_t and modified add_frame() accordingly; removed no more used drop_delayed_audio() and save_delayed_audio()
nicodvb
parents: 18166
diff changeset
1925 if(ret < 0)
afaa492536f6 new code to simplify assignment of timestamps; removed temp_ref from mpeg_frame_t and modified add_frame() accordingly; removed no more used drop_delayed_audio() and save_delayed_audio()
nicodvb
parents: 18166
diff changeset
1926 {
18196
f7f6984638f8 finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents: 18192
diff changeset
1927 mp_msg(MSGT_MUXER, MSGL_FATAL, "\r\nPARSE_MPEG4: add_frames(%d) failed, exit\r\n", len);
18181
afaa492536f6 new code to simplify assignment of timestamps; removed temp_ref from mpeg_frame_t and modified add_frame() accordingly; removed no more used drop_delayed_audio() and save_delayed_audio()
nicodvb
parents: 18166
diff changeset
1928 return 0;
afaa492536f6 new code to simplify assignment of timestamps; removed temp_ref from mpeg_frame_t and modified add_frame() accordingly; removed no more used drop_delayed_audio() and save_delayed_audio()
nicodvb
parents: 18166
diff changeset
1929 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1930
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1931 if(!vpriv->frame_duration && vpriv->framebuf_used == 3)
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1932 {
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1933 vpriv->frame_duration = fix_mp4_frame_duration(vpriv);
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1934 if(vpriv->frame_duration)
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1935 {
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1936 vpriv->last_pts += vpriv->frame_duration;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1937 vpriv->last_dts = vpriv->framebuf[vpriv->framebuf_used-1].dts;
18161
516d7874450b changed timebase from 1024 to 300 (no rounding errors with any of the allowed framerates); write scr_extension accordingly. This is the first of a long series of patches to rewrite the muxer
nicodvb
parents: 18044
diff changeset
1938 vpriv->delta_clock = ((double) vpriv->frame_duration)/27000000.0;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1939 mp_msg(MSGT_MUXER, MSGL_INFO, "FRAME DURATION: %"PRIu64" %.3lf\n",
18161
516d7874450b changed timebase from 1024 to 300 (no rounding errors with any of the allowed framerates); write scr_extension accordingly. This is the first of a long series of patches to rewrite the muxer
nicodvb
parents: 18044
diff changeset
1940 vpriv->frame_duration, (double) (vpriv->frame_duration/27000000.0));
18181
afaa492536f6 new code to simplify assignment of timestamps; removed temp_ref from mpeg_frame_t and modified add_frame() accordingly; removed no more used drop_delayed_audio() and save_delayed_audio()
nicodvb
parents: 18166
diff changeset
1941 vpriv->is_ready = 1;
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1942 }
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1943 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1944
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1945 mp_msg(MSGT_MUXER, MSGL_DBG2, "LAST_PTS: %.3lf, LAST_DTS: %.3lf\n",
18161
516d7874450b changed timebase from 1024 to 300 (no rounding errors with any of the allowed framerates); write scr_extension accordingly. This is the first of a long series of patches to rewrite the muxer
nicodvb
parents: 18044
diff changeset
1946 (double) (vpriv->last_pts/27000000.0), (double) (vpriv->last_dts/27000000.0));
18181
afaa492536f6 new code to simplify assignment of timestamps; removed temp_ref from mpeg_frame_t and modified add_frame() accordingly; removed no more used drop_delayed_audio() and save_delayed_audio()
nicodvb
parents: 18166
diff changeset
1947
afaa492536f6 new code to simplify assignment of timestamps; removed temp_ref from mpeg_frame_t and modified add_frame() accordingly; removed no more used drop_delayed_audio() and save_delayed_audio()
nicodvb
parents: 18166
diff changeset
1948 vpriv->vframes++;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1949
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1950 return len;
8585
27da710563c2 the long-waited MUXER layer, and new MPEG-PS muxer
arpi
parents:
diff changeset
1951 }
27da710563c2 the long-waited MUXER layer, and new MPEG-PS muxer
arpi
parents:
diff changeset
1952
15947
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
1953
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
1954 static int fill_last_frame(muxer_headers_t *spriv, uint8_t *ptr, int len)
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
1955 {
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
1956 int idx;
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
1957
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
1958 if(!len)
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
1959 return 0;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1960
15947
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
1961 if(spriv->framebuf_used == 0)
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
1962 idx = spriv->framebuf_used;
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
1963 else
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
1964 idx = spriv->framebuf_used - 1;
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
1965
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
1966 if(spriv->framebuf[idx].alloc_size < spriv->framebuf[idx].size + len)
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
1967 {
18558
4928dd61f136 Fix potential integer overflows in memory allocation.
rtogni
parents: 18249
diff changeset
1968 if(spriv->framebuf[idx].size > SIZE_MAX - (size_t)len)
4928dd61f136 Fix potential integer overflows in memory allocation.
rtogni
parents: 18249
diff changeset
1969 return 0;
30702
9fc9d1e788aa Do not cast the results of malloc/calloc/realloc.
diego
parents: 30633
diff changeset
1970 spriv->framebuf[idx].buffer = realloc(spriv->framebuf[idx].buffer, spriv->framebuf[idx].size + len);
15947
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
1971 if(! spriv->framebuf[idx].buffer)
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
1972 return 0;
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
1973 spriv->framebuf[idx].alloc_size = spriv->framebuf[idx].size + len;
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
1974 }
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
1975
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
1976 memcpy(&(spriv->framebuf[idx].buffer[spriv->framebuf[idx].size]), ptr, len);
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
1977 spriv->framebuf[idx].size += len;
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
1978
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
1979 return len;
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
1980 }
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
1981
18181
afaa492536f6 new code to simplify assignment of timestamps; removed temp_ref from mpeg_frame_t and modified add_frame() accordingly; removed no more used drop_delayed_audio() and save_delayed_audio()
nicodvb
parents: 18166
diff changeset
1982 static int add_frame(muxer_headers_t *spriv, uint64_t idur, uint8_t *ptr, int len, uint8_t pt, uint64_t dts, uint64_t pts)
15947
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
1983 {
18181
afaa492536f6 new code to simplify assignment of timestamps; removed temp_ref from mpeg_frame_t and modified add_frame() accordingly; removed no more used drop_delayed_audio() and save_delayed_audio()
nicodvb
parents: 18166
diff changeset
1984 int idx;
15947
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
1985
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
1986 idx = spriv->framebuf_used;
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
1987 if(idx >= spriv->framebuf_cnt)
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
1988 {
30702
9fc9d1e788aa Do not cast the results of malloc/calloc/realloc.
diego
parents: 30633
diff changeset
1989 spriv->framebuf = realloc_struct(spriv->framebuf, (spriv->framebuf_cnt+1), sizeof(mpeg_frame_t));
15947
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
1990 if(spriv->framebuf == NULL)
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
1991 {
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
1992 mp_msg(MSGT_MUXER, MSGL_FATAL, "Couldn't realloc frame buffer(idx), abort\n");
17298
104b09de82b9 removed broken frame reording code; unified audio and video frame storing code (in memory, not in the packets); simple workaround to handle non-standard framerate mpeg1/2 video
nicodvb
parents: 17271
diff changeset
1993 return -1;
15947
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
1994 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1995
15947
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
1996 spriv->framebuf[spriv->framebuf_cnt].size = 0;
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
1997 spriv->framebuf[spriv->framebuf_cnt].alloc_size = 0;
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
1998 spriv->framebuf[spriv->framebuf_cnt].pos = 0;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1999
30702
9fc9d1e788aa Do not cast the results of malloc/calloc/realloc.
diego
parents: 30633
diff changeset
2000 spriv->framebuf[spriv->framebuf_cnt].buffer = malloc(len);
15947
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
2001 if(spriv->framebuf[spriv->framebuf_cnt].buffer == NULL)
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
2002 {
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
2003 mp_msg(MSGT_MUXER, MSGL_FATAL, "Couldn't realloc frame buffer(frame), abort\n");
17298
104b09de82b9 removed broken frame reording code; unified audio and video frame storing code (in memory, not in the packets); simple workaround to handle non-standard framerate mpeg1/2 video
nicodvb
parents: 17271
diff changeset
2004 return -1;
15947
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
2005 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
2006 spriv->framebuf[spriv->framebuf_cnt].alloc_size = len;
15947
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
2007 spriv->framebuf_cnt++;
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
2008 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
2009
15947
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
2010 if(spriv->framebuf[idx].alloc_size < spriv->framebuf[idx].size + len)
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
2011 {
18558
4928dd61f136 Fix potential integer overflows in memory allocation.
rtogni
parents: 18249
diff changeset
2012 if(spriv->framebuf[idx].size > SIZE_MAX - (size_t)len)
4928dd61f136 Fix potential integer overflows in memory allocation.
rtogni
parents: 18249
diff changeset
2013 {
4928dd61f136 Fix potential integer overflows in memory allocation.
rtogni
parents: 18249
diff changeset
2014 mp_msg(MSGT_MUXER, MSGL_FATAL, "Size overflow, couldn't realloc frame buffer(frame), abort\n");
4928dd61f136 Fix potential integer overflows in memory allocation.
rtogni
parents: 18249
diff changeset
2015 return -1;
4928dd61f136 Fix potential integer overflows in memory allocation.
rtogni
parents: 18249
diff changeset
2016 }
15947
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
2017 spriv->framebuf[idx].buffer = realloc(spriv->framebuf[idx].buffer, spriv->framebuf[idx].size + len);
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
2018 if(spriv->framebuf[idx].buffer == NULL)
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
2019 {
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
2020 mp_msg(MSGT_MUXER, MSGL_FATAL, "Couldn't realloc frame buffer(frame), abort\n");
17298
104b09de82b9 removed broken frame reording code; unified audio and video frame storing code (in memory, not in the packets); simple workaround to handle non-standard framerate mpeg1/2 video
nicodvb
parents: 17271
diff changeset
2021 return -1;
15947
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
2022 }
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
2023 spriv->framebuf[idx].alloc_size = spriv->framebuf[idx].size + len;
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
2024 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
2025
15947
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
2026 memcpy(&(spriv->framebuf[idx].buffer[spriv->framebuf[idx].size]), ptr, len);
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
2027 spriv->framebuf[idx].size += len;
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
2028 spriv->framebuf[idx].pos = 0;
17298
104b09de82b9 removed broken frame reording code; unified audio and video frame storing code (in memory, not in the packets); simple workaround to handle non-standard framerate mpeg1/2 video
nicodvb
parents: 17271
diff changeset
2029 spriv->framebuf[idx].type = pt;
15947
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
2030
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
2031 spriv->framebuf[idx].idur = idur;
18181
afaa492536f6 new code to simplify assignment of timestamps; removed temp_ref from mpeg_frame_t and modified add_frame() accordingly; removed no more used drop_delayed_audio() and save_delayed_audio()
nicodvb
parents: 18166
diff changeset
2032 spriv->framebuf[idx].dts = dts;
afaa492536f6 new code to simplify assignment of timestamps; removed temp_ref from mpeg_frame_t and modified add_frame() accordingly; removed no more used drop_delayed_audio() and save_delayed_audio()
nicodvb
parents: 18166
diff changeset
2033 spriv->framebuf[idx].pts = pts;
15947
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
2034 spriv->framebuf_used++;
23637
df9aa9eb9de6 Use proper PRI?64 format strings
reimar
parents: 22929
diff changeset
2035 mp_msg(MSGT_MUXER, MSGL_DBG2, "\r\nAdded frame, size: %u, idur: %"PRIu64", dts: %"PRIu64", pts: %"PRIu64", used: %u\r\n", len, idur, dts, pts, spriv->framebuf_used);
15947
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
2036
17298
104b09de82b9 removed broken frame reording code; unified audio and video frame storing code (in memory, not in the packets); simple workaround to handle non-standard framerate mpeg1/2 video
nicodvb
parents: 17271
diff changeset
2037 return idx;
15947
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
2038 }
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
2039
18248
595d94213ad0 when muxing mpeg audio streams analyze the first 32 KB of data to obtain the most likely correct layer, otherwise every misdetection during parse_audio() will lead to wrong timestamps and loss of synchrony
nicodvb
parents: 18238
diff changeset
2040 static int analyze_mpa(muxer_stream_t *s)
595d94213ad0 when muxing mpeg audio streams analyze the first 32 KB of data to obtain the most likely correct layer, otherwise every misdetection during parse_audio() will lead to wrong timestamps and loss of synchrony
nicodvb
parents: 18238
diff changeset
2041 {
595d94213ad0 when muxing mpeg audio streams analyze the first 32 KB of data to obtain the most likely correct layer, otherwise every misdetection during parse_audio() will lead to wrong timestamps and loss of synchrony
nicodvb
parents: 18238
diff changeset
2042 int i = 0, len, max, chans, srate, spf, layer;
595d94213ad0 when muxing mpeg audio streams analyze the first 32 KB of data to obtain the most likely correct layer, otherwise every misdetection during parse_audio() will lead to wrong timestamps and loss of synchrony
nicodvb
parents: 18238
diff changeset
2043 int score[4] = {0, 0, 0, 0};
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
2044
18248
595d94213ad0 when muxing mpeg audio streams analyze the first 32 KB of data to obtain the most likely correct layer, otherwise every misdetection during parse_audio() will lead to wrong timestamps and loss of synchrony
nicodvb
parents: 18238
diff changeset
2045 while(i < s->b_buffer_len + 3)
595d94213ad0 when muxing mpeg audio streams analyze the first 32 KB of data to obtain the most likely correct layer, otherwise every misdetection during parse_audio() will lead to wrong timestamps and loss of synchrony
nicodvb
parents: 18238
diff changeset
2046 {
595d94213ad0 when muxing mpeg audio streams analyze the first 32 KB of data to obtain the most likely correct layer, otherwise every misdetection during parse_audio() will lead to wrong timestamps and loss of synchrony
nicodvb
parents: 18238
diff changeset
2047 if(s->b_buffer[i] == 0xFF && ((s->b_buffer[i+1] & 0xE0) == 0xE0))
595d94213ad0 when muxing mpeg audio streams analyze the first 32 KB of data to obtain the most likely correct layer, otherwise every misdetection during parse_audio() will lead to wrong timestamps and loss of synchrony
nicodvb
parents: 18238
diff changeset
2048 {
595d94213ad0 when muxing mpeg audio streams analyze the first 32 KB of data to obtain the most likely correct layer, otherwise every misdetection during parse_audio() will lead to wrong timestamps and loss of synchrony
nicodvb
parents: 18238
diff changeset
2049 len = mp_get_mp3_header(&(s->b_buffer[i]), &chans, &srate, &spf, &layer, NULL);
595d94213ad0 when muxing mpeg audio streams analyze the first 32 KB of data to obtain the most likely correct layer, otherwise every misdetection during parse_audio() will lead to wrong timestamps and loss of synchrony
nicodvb
parents: 18238
diff changeset
2050 if(len > 0 && (srate == s->wf->nSamplesPerSec) && (i + len <= s->b_buffer_len))
595d94213ad0 when muxing mpeg audio streams analyze the first 32 KB of data to obtain the most likely correct layer, otherwise every misdetection during parse_audio() will lead to wrong timestamps and loss of synchrony
nicodvb
parents: 18238
diff changeset
2051 {
595d94213ad0 when muxing mpeg audio streams analyze the first 32 KB of data to obtain the most likely correct layer, otherwise every misdetection during parse_audio() will lead to wrong timestamps and loss of synchrony
nicodvb
parents: 18238
diff changeset
2052 score[layer]++;
595d94213ad0 when muxing mpeg audio streams analyze the first 32 KB of data to obtain the most likely correct layer, otherwise every misdetection during parse_audio() will lead to wrong timestamps and loss of synchrony
nicodvb
parents: 18238
diff changeset
2053 i += len;
595d94213ad0 when muxing mpeg audio streams analyze the first 32 KB of data to obtain the most likely correct layer, otherwise every misdetection during parse_audio() will lead to wrong timestamps and loss of synchrony
nicodvb
parents: 18238
diff changeset
2054 }
595d94213ad0 when muxing mpeg audio streams analyze the first 32 KB of data to obtain the most likely correct layer, otherwise every misdetection during parse_audio() will lead to wrong timestamps and loss of synchrony
nicodvb
parents: 18238
diff changeset
2055 }
595d94213ad0 when muxing mpeg audio streams analyze the first 32 KB of data to obtain the most likely correct layer, otherwise every misdetection during parse_audio() will lead to wrong timestamps and loss of synchrony
nicodvb
parents: 18238
diff changeset
2056 i++;
595d94213ad0 when muxing mpeg audio streams analyze the first 32 KB of data to obtain the most likely correct layer, otherwise every misdetection during parse_audio() will lead to wrong timestamps and loss of synchrony
nicodvb
parents: 18238
diff changeset
2057 }
595d94213ad0 when muxing mpeg audio streams analyze the first 32 KB of data to obtain the most likely correct layer, otherwise every misdetection during parse_audio() will lead to wrong timestamps and loss of synchrony
nicodvb
parents: 18238
diff changeset
2058
595d94213ad0 when muxing mpeg audio streams analyze the first 32 KB of data to obtain the most likely correct layer, otherwise every misdetection during parse_audio() will lead to wrong timestamps and loss of synchrony
nicodvb
parents: 18238
diff changeset
2059 max = 0;
595d94213ad0 when muxing mpeg audio streams analyze the first 32 KB of data to obtain the most likely correct layer, otherwise every misdetection during parse_audio() will lead to wrong timestamps and loss of synchrony
nicodvb
parents: 18238
diff changeset
2060 layer = 2;
595d94213ad0 when muxing mpeg audio streams analyze the first 32 KB of data to obtain the most likely correct layer, otherwise every misdetection during parse_audio() will lead to wrong timestamps and loss of synchrony
nicodvb
parents: 18238
diff changeset
2061 for(i = 1; i <= 3; i++)
595d94213ad0 when muxing mpeg audio streams analyze the first 32 KB of data to obtain the most likely correct layer, otherwise every misdetection during parse_audio() will lead to wrong timestamps and loss of synchrony
nicodvb
parents: 18238
diff changeset
2062 {
595d94213ad0 when muxing mpeg audio streams analyze the first 32 KB of data to obtain the most likely correct layer, otherwise every misdetection during parse_audio() will lead to wrong timestamps and loss of synchrony
nicodvb
parents: 18238
diff changeset
2063 if(score[i] >= max)
595d94213ad0 when muxing mpeg audio streams analyze the first 32 KB of data to obtain the most likely correct layer, otherwise every misdetection during parse_audio() will lead to wrong timestamps and loss of synchrony
nicodvb
parents: 18238
diff changeset
2064 {
595d94213ad0 when muxing mpeg audio streams analyze the first 32 KB of data to obtain the most likely correct layer, otherwise every misdetection during parse_audio() will lead to wrong timestamps and loss of synchrony
nicodvb
parents: 18238
diff changeset
2065 max = score[i];
595d94213ad0 when muxing mpeg audio streams analyze the first 32 KB of data to obtain the most likely correct layer, otherwise every misdetection during parse_audio() will lead to wrong timestamps and loss of synchrony
nicodvb
parents: 18238
diff changeset
2066 layer = i;
595d94213ad0 when muxing mpeg audio streams analyze the first 32 KB of data to obtain the most likely correct layer, otherwise every misdetection during parse_audio() will lead to wrong timestamps and loss of synchrony
nicodvb
parents: 18238
diff changeset
2067 }
595d94213ad0 when muxing mpeg audio streams analyze the first 32 KB of data to obtain the most likely correct layer, otherwise every misdetection during parse_audio() will lead to wrong timestamps and loss of synchrony
nicodvb
parents: 18238
diff changeset
2068 }
595d94213ad0 when muxing mpeg audio streams analyze the first 32 KB of data to obtain the most likely correct layer, otherwise every misdetection during parse_audio() will lead to wrong timestamps and loss of synchrony
nicodvb
parents: 18238
diff changeset
2069
595d94213ad0 when muxing mpeg audio streams analyze the first 32 KB of data to obtain the most likely correct layer, otherwise every misdetection during parse_audio() will lead to wrong timestamps and loss of synchrony
nicodvb
parents: 18238
diff changeset
2070 return layer; //actual layer with the highest score
595d94213ad0 when muxing mpeg audio streams analyze the first 32 KB of data to obtain the most likely correct layer, otherwise every misdetection during parse_audio() will lead to wrong timestamps and loss of synchrony
nicodvb
parents: 18238
diff changeset
2071 }
15947
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
2072
18181
afaa492536f6 new code to simplify assignment of timestamps; removed temp_ref from mpeg_frame_t and modified add_frame() accordingly; removed no more used drop_delayed_audio() and save_delayed_audio()
nicodvb
parents: 18166
diff changeset
2073 static int parse_audio(muxer_stream_t *s, int finalize, unsigned int *nf, double *timer, double delay, int drop)
15947
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
2074 {
18181
afaa492536f6 new code to simplify assignment of timestamps; removed temp_ref from mpeg_frame_t and modified add_frame() accordingly; removed no more used drop_delayed_audio() and save_delayed_audio()
nicodvb
parents: 18166
diff changeset
2075 int i, j, len, chans, srate, spf, layer, dummy, tot, num, frm_idx;
18238
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2076 int finished;
18181
afaa492536f6 new code to simplify assignment of timestamps; removed temp_ref from mpeg_frame_t and modified add_frame() accordingly; removed no more used drop_delayed_audio() and save_delayed_audio()
nicodvb
parents: 18166
diff changeset
2077 unsigned int frames;
15947
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
2078 uint64_t idur;
18181
afaa492536f6 new code to simplify assignment of timestamps; removed temp_ref from mpeg_frame_t and modified add_frame() accordingly; removed no more used drop_delayed_audio() and save_delayed_audio()
nicodvb
parents: 18166
diff changeset
2079 double dur;
15947
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
2080 muxer_headers_t *spriv = (muxer_headers_t *) s->priv;
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
2081
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
2082 i = tot = frames = 0;
18238
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2083 finished = 0;
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2084 while(1)
15947
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
2085 {
18238
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2086 len = 0;
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2087 switch(s->wf->wFormatTag)
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2088 {
15947
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
2089 case AUDIO_MP2:
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
2090 case AUDIO_MP3:
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
2091 {
18238
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2092 if(i + 3 >= s->b_buffer_len)
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2093 {
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2094 finished = 1;
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2095 break;
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2096 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
2097
15947
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
2098 if(s->b_buffer[i] == 0xFF && ((s->b_buffer[i+1] & 0xE0) == 0xE0))
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
2099 {
16162
b5c2254d13f8 set i_bps in demux_audio for WAV and MP3 to avoid division by zero before
reimar
parents: 15947
diff changeset
2100 len = mp_get_mp3_header(&(s->b_buffer[i]), &chans, &srate, &spf, &layer, NULL);
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
2101 if(len > 0 && (srate == s->wf->nSamplesPerSec) && (i + len <= s->b_buffer_len)
18248
595d94213ad0 when muxing mpeg audio streams analyze the first 32 KB of data to obtain the most likely correct layer, otherwise every misdetection during parse_audio() will lead to wrong timestamps and loss of synchrony
nicodvb
parents: 18238
diff changeset
2102 && layer == spriv->mpa_layer)
15947
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
2103 {
18181
afaa492536f6 new code to simplify assignment of timestamps; removed temp_ref from mpeg_frame_t and modified add_frame() accordingly; removed no more used drop_delayed_audio() and save_delayed_audio()
nicodvb
parents: 18166
diff changeset
2104 dur = (double) spf / (double) srate;
18161
516d7874450b changed timebase from 1024 to 300 (no rounding errors with any of the allowed framerates); write scr_extension accordingly. This is the first of a long series of patches to rewrite the muxer
nicodvb
parents: 18044
diff changeset
2105 idur = (27000000ULL * spf) / srate;
15947
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
2106 }
18238
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2107 else
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2108 len = 0;
15947
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
2109 }
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
2110 }
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
2111 break;
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
2112
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
2113 case AUDIO_A52:
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
2114 {
18238
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2115 if(i + 6 >= s->b_buffer_len)
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2116 {
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2117 finished = 1;
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2118 break;
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2119 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
2120
15947
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
2121 if(s->b_buffer[i] == 0x0B && s->b_buffer[i+1] == 0x77)
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
2122 {
17493
f71e678e6216 use mp_a52_framesize() when liba52 is not available
nicodvb
parents: 17487
diff changeset
2123 srate = 0;
27341
e7c989f7a7c9 Start unifying names of internal preprocessor directives.
diego
parents: 26758
diff changeset
2124 #ifdef CONFIG_LIBA52
15947
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
2125 len = a52_syncinfo(&(s->b_buffer[i]), &dummy, &srate, &dummy);
17493
f71e678e6216 use mp_a52_framesize() when liba52 is not available
nicodvb
parents: 17487
diff changeset
2126 #else
f71e678e6216 use mp_a52_framesize() when liba52 is not available
nicodvb
parents: 17487
diff changeset
2127 len = mp_a52_framesize(&(s->b_buffer[i]), &srate);
f71e678e6216 use mp_a52_framesize() when liba52 is not available
nicodvb
parents: 17487
diff changeset
2128 #endif
15947
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
2129 if((len > 0) && (srate == s->wf->nSamplesPerSec) && (i + len <= s->b_buffer_len))
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
2130 {
18181
afaa492536f6 new code to simplify assignment of timestamps; removed temp_ref from mpeg_frame_t and modified add_frame() accordingly; removed no more used drop_delayed_audio() and save_delayed_audio()
nicodvb
parents: 18166
diff changeset
2131 dur = (double) 1536 / (double) srate;
18161
516d7874450b changed timebase from 1024 to 300 (no rounding errors with any of the allowed framerates); write scr_extension accordingly. This is the first of a long series of patches to rewrite the muxer
nicodvb
parents: 18044
diff changeset
2132 idur = (27000000ULL * 1536) / srate;
15947
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
2133 }
18238
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2134 else
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2135 len = 0;
15947
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
2136 }
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
2137 }
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
2138 break;
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
2139
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
2140 case AUDIO_AAC1:
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
2141 case AUDIO_AAC2:
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
2142 {
18238
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2143 if(i + 7 >= s->b_buffer_len)
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2144 {
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2145 finished = 1;
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2146 break;
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2147 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
2148
15947
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
2149 if(s->b_buffer[i] == 0xFF && ((s->b_buffer[i+1] & 0xF6) == 0xF0))
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
2150 {
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
2151 len = aac_parse_frame(&(s->b_buffer[i]), &srate, &num);
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
2152 if((len > 0) && (srate == s->wf->nSamplesPerSec) && (i + len <= s->b_buffer_len))
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
2153 {
18181
afaa492536f6 new code to simplify assignment of timestamps; removed temp_ref from mpeg_frame_t and modified add_frame() accordingly; removed no more used drop_delayed_audio() and save_delayed_audio()
nicodvb
parents: 18166
diff changeset
2154 dur = (double) 1024 / (double) srate;
18161
516d7874450b changed timebase from 1024 to 300 (no rounding errors with any of the allowed framerates); write scr_extension accordingly. This is the first of a long series of patches to rewrite the muxer
nicodvb
parents: 18044
diff changeset
2155 idur = (27000000ULL * 1024 * num) / srate;
15947
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
2156 }
18238
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2157 else
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2158 len = 0;
15947
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
2159 }
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
2160 }
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
2161 }
18238
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2162
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2163 if(finished)
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2164 break;
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2165
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2166 if(!len)
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2167 {
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2168 i++;
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2169 continue;
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2170 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
2171
18238
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2172 spriv->timer += dur;
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2173 if(spriv->drop_delayed_frames && delay < 0 && spriv->timer <= -delay)
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2174 {
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2175 i += len;
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2176 tot = i;
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2177 continue;
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2178 }
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2179
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2180 frames++;
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2181 fill_last_frame(spriv, &(s->b_buffer[tot]), i - tot);
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2182 frm_idx = add_frame(spriv, idur, &(s->b_buffer[i]), len, 0, spriv->last_pts, spriv->last_pts);
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2183 if(frm_idx < 0)
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2184 {
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2185 mp_msg(MSGT_MUXER, MSGL_FATAL, "Couldn't add audio frame buffer(frame), abort\n");
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2186 goto audio_exit;
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2187 }
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2188 for(j = frm_idx; j < spriv->framebuf_cnt; j++)
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2189 spriv->framebuf[j].pts = spriv->last_pts;
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2190 spriv->last_pts += idur;
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2191
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2192 i += len;
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2193 tot = i;
15947
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
2194 }
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
2195
18238
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2196 audio_exit:
15947
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
2197 if(tot)
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
2198 {
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
2199 memmove(s->b_buffer, &(s->b_buffer[tot]), s->b_buffer_len - tot);
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
2200 s->b_buffer_len -= tot;
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
2201 s->b_buffer_ptr += tot;
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
2202 if(s->b_buffer_len > 0)
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
2203 memmove(s->b_buffer, &(s->b_buffer[s->b_buffer_ptr]), s->b_buffer_len);
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
2204 s->b_buffer_ptr = 0;
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
2205 }
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
2206
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
2207 if(finalize)
17298
104b09de82b9 removed broken frame reording code; unified audio and video frame storing code (in memory, not in the packets); simple workaround to handle non-standard framerate mpeg1/2 video
nicodvb
parents: 17271
diff changeset
2208 {
18181
afaa492536f6 new code to simplify assignment of timestamps; removed temp_ref from mpeg_frame_t and modified add_frame() accordingly; removed no more used drop_delayed_audio() and save_delayed_audio()
nicodvb
parents: 18166
diff changeset
2209 frm_idx = add_frame(spriv, 0, s->b_buffer, s->b_buffer_len, 0, spriv->last_pts, spriv->last_pts);
17298
104b09de82b9 removed broken frame reording code; unified audio and video frame storing code (in memory, not in the packets); simple workaround to handle non-standard framerate mpeg1/2 video
nicodvb
parents: 17271
diff changeset
2210 if(frm_idx >= 0)
104b09de82b9 removed broken frame reording code; unified audio and video frame storing code (in memory, not in the packets); simple workaround to handle non-standard framerate mpeg1/2 video
nicodvb
parents: 17271
diff changeset
2211 {
104b09de82b9 removed broken frame reording code; unified audio and video frame storing code (in memory, not in the packets); simple workaround to handle non-standard framerate mpeg1/2 video
nicodvb
parents: 17271
diff changeset
2212 for(j = frm_idx; j < spriv->framebuf_cnt; j++)
104b09de82b9 removed broken frame reording code; unified audio and video frame storing code (in memory, not in the packets); simple workaround to handle non-standard framerate mpeg1/2 video
nicodvb
parents: 17271
diff changeset
2213 spriv->framebuf[j].pts = spriv->last_pts;
104b09de82b9 removed broken frame reording code; unified audio and video frame storing code (in memory, not in the packets); simple workaround to handle non-standard framerate mpeg1/2 video
nicodvb
parents: 17271
diff changeset
2214 }
104b09de82b9 removed broken frame reording code; unified audio and video frame storing code (in memory, not in the packets); simple workaround to handle non-standard framerate mpeg1/2 video
nicodvb
parents: 17271
diff changeset
2215 }
104b09de82b9 removed broken frame reording code; unified audio and video frame storing code (in memory, not in the packets); simple workaround to handle non-standard framerate mpeg1/2 video
nicodvb
parents: 17271
diff changeset
2216
15947
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
2217 *nf = frames;
18181
afaa492536f6 new code to simplify assignment of timestamps; removed temp_ref from mpeg_frame_t and modified add_frame() accordingly; removed no more used drop_delayed_audio() and save_delayed_audio()
nicodvb
parents: 18166
diff changeset
2218 *timer = spriv->timer;
15947
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
2219
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
2220 return tot;
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
2221 }
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
2222
18183
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
2223 static void fix_parameters(muxer_stream_t *stream)
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
2224 {
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
2225 muxer_headers_t *spriv = stream->priv;
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
2226 muxer_t *muxer = stream->muxer;
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
2227 muxer_priv_t *priv = muxer->priv;
24905
170dcb44069a moved to fix_parameters() the code that decides if the PSM is needed
nicodvb
parents: 24904
diff changeset
2228 uint32_t stream_format;
24909
55c96e871198 10l, priv->use_psm can be 1 only if the format is genmpeg2
nicodvb
parents: 24908
diff changeset
2229 int needs_psm = 0;
18183
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
2230
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
2231 if(stream->type == MUXER_TYPE_AUDIO)
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
2232 {
24905
170dcb44069a moved to fix_parameters() the code that decides if the PSM is needed
nicodvb
parents: 24904
diff changeset
2233 stream_format = stream->wf->wFormatTag;
18248
595d94213ad0 when muxing mpeg audio streams analyze the first 32 KB of data to obtain the most likely correct layer, otherwise every misdetection during parse_audio() will lead to wrong timestamps and loss of synchrony
nicodvb
parents: 18238
diff changeset
2234 spriv->is_ready = 1;
21413
06d63614eeaa permit to specify the sizes of the decoders' buffers
nicodvb
parents: 21372
diff changeset
2235 if(conf_abuf_size)
06d63614eeaa permit to specify the sizes of the decoders' buffers
nicodvb
parents: 21372
diff changeset
2236 spriv->max_buffer_size = conf_abuf_size*1024;
06d63614eeaa permit to specify the sizes of the decoders' buffers
nicodvb
parents: 21372
diff changeset
2237 else
18183
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
2238 spriv->max_buffer_size = 4*1024;
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
2239 if(stream->wf->wFormatTag == AUDIO_A52)
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
2240 {
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
2241 stream->ckid = be2me_32 (0x1bd);
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
2242 if(priv->is_genmpeg1 || priv->is_genmpeg2)
21531
a90aa203186c Get rid of min/max macros from aviheader.h, they do not belong here.
reimar
parents: 21486
diff changeset
2243 fix_audio_sys_header(priv, spriv->id, 0xbd, FFMAX(conf_abuf_size, 58)*1024); //only one audio at the moment
18183
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
2244 spriv->id = 0xbd;
21413
06d63614eeaa permit to specify the sizes of the decoders' buffers
nicodvb
parents: 21372
diff changeset
2245 if(!conf_abuf_size)
18183
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
2246 spriv->max_buffer_size = 16*1024;
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
2247 }
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
2248 else if(stream->wf->wFormatTag == AUDIO_AAC1 || stream->wf->wFormatTag == AUDIO_AAC2)
24909
55c96e871198 10l, priv->use_psm can be 1 only if the format is genmpeg2
nicodvb
parents: 24908
diff changeset
2249 needs_psm = 1;
18248
595d94213ad0 when muxing mpeg audio streams analyze the first 32 KB of data to obtain the most likely correct layer, otherwise every misdetection during parse_audio() will lead to wrong timestamps and loss of synchrony
nicodvb
parents: 18238
diff changeset
2250 else if(stream->wf->wFormatTag == AUDIO_MP2 || stream->wf->wFormatTag == AUDIO_MP3)
595d94213ad0 when muxing mpeg audio streams analyze the first 32 KB of data to obtain the most likely correct layer, otherwise every misdetection during parse_audio() will lead to wrong timestamps and loss of synchrony
nicodvb
parents: 18238
diff changeset
2251 spriv->is_ready = 0;
18183
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
2252 }
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
2253 else //video
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
2254 {
24905
170dcb44069a moved to fix_parameters() the code that decides if the PSM is needed
nicodvb
parents: 24904
diff changeset
2255 stream_format = stream->bih->biCompression;
21413
06d63614eeaa permit to specify the sizes of the decoders' buffers
nicodvb
parents: 21372
diff changeset
2256 if(conf_vbuf_size)
06d63614eeaa permit to specify the sizes of the decoders' buffers
nicodvb
parents: 21372
diff changeset
2257 spriv->max_buffer_size = conf_vbuf_size*1024;
06d63614eeaa permit to specify the sizes of the decoders' buffers
nicodvb
parents: 21372
diff changeset
2258 else
06d63614eeaa permit to specify the sizes of the decoders' buffers
nicodvb
parents: 21372
diff changeset
2259 {
24902
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2260 if(priv->is_dvd)
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2261 spriv->max_buffer_size = 232*1024;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2262 else if(priv->is_xsvcd)
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2263 spriv->max_buffer_size = 230*1024;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2264 else if(priv->is_xvcd)
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2265 spriv->max_buffer_size = 46*1024;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2266 else
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2267 spriv->max_buffer_size = 232*1024; //no profile => unconstrained :) FIXME!!!
21413
06d63614eeaa permit to specify the sizes of the decoders' buffers
nicodvb
parents: 21372
diff changeset
2268 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
2269
18183
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
2270 if(is_mpeg4(stream->bih->biCompression))
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
2271 spriv->is_ready = 0;
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
2272 else
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
2273 spriv->is_ready = 1;
24907
91d30168e22e moved to fix_parameters() the decision of the necessity of the PSM based on the format of the video stream
nicodvb
parents: 24906
diff changeset
2274
91d30168e22e moved to fix_parameters() the decision of the necessity of the PSM based on the format of the video stream
nicodvb
parents: 24906
diff changeset
2275 if(!is_mpeg1(stream_format) && !is_mpeg2(stream_format))
24909
55c96e871198 10l, priv->use_psm can be 1 only if the format is genmpeg2
nicodvb
parents: 24908
diff changeset
2276 needs_psm = 1;
18183
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
2277 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
2278
24909
55c96e871198 10l, priv->use_psm can be 1 only if the format is genmpeg2
nicodvb
parents: 24908
diff changeset
2279 if(priv->is_genmpeg2 && needs_psm)
24905
170dcb44069a moved to fix_parameters() the code that decides if the PSM is needed
nicodvb
parents: 24904
diff changeset
2280 {
24909
55c96e871198 10l, priv->use_psm can be 1 only if the format is genmpeg2
nicodvb
parents: 24908
diff changeset
2281 priv->use_psm = 1;
24905
170dcb44069a moved to fix_parameters() the code that decides if the PSM is needed
nicodvb
parents: 24904
diff changeset
2282 add_to_psm(priv, spriv->id, stream_format);
170dcb44069a moved to fix_parameters() the code that decides if the PSM is needed
nicodvb
parents: 24904
diff changeset
2283 priv->psm_streams_cnt++;
170dcb44069a moved to fix_parameters() the code that decides if the PSM is needed
nicodvb
parents: 24904
diff changeset
2284 }
18183
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
2285 }
15947
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
2286
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
2287
24902
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2288 static void mpegfile_write_chunk(muxer_stream_t *s,size_t len,unsigned int flags, double dts_arg, double pts_arg)
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2289 {
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2290 size_t sz = 0;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2291 uint64_t tmp;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2292 muxer_t *muxer = s->muxer;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2293 muxer_priv_t *priv = (muxer_priv_t *)muxer->priv;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2294 muxer_headers_t *spriv = (muxer_headers_t*) s->priv;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2295 float fps;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2296 uint32_t stream_format, nf;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2297
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2298 if(s->buffer == NULL || len == -1)
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2299 return;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2300
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2301 if (s->type == MUXER_TYPE_VIDEO)
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2302 { // try to recognize frame type...
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2303 fps = (float) s->h.dwRate/ (float) s->h.dwScale;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2304 spriv->type = 1;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2305 stream_format = s->bih->biCompression;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2306 if(! spriv->vframes)
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2307 {
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2308 spriv->last_dts = spriv->last_pts - (uint64_t)(27000000.0f/fps);
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2309 mp_msg(MSGT_MUXER, MSGL_INFO,"INITV: %.3lf, %.3lf, fps: %.3f\r\n", (double) spriv->last_pts/27000000.0f, (double) spriv->last_dts/27000000.0f, fps);
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2310 }
21448
24775c741a9a cosmetics: anti-chaos reindentation
nicodvb
parents: 21413
diff changeset
2311
24902
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2312 if(is_mpeg1(stream_format) || is_mpeg2(stream_format))
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2313 {
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2314 spriv->is_mpeg12 = 1;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2315 spriv->is_ready = 1;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2316 if(len)
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2317 sz = parse_mpeg12_video(s, priv, spriv, fps, len);
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2318 else
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2319 {
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2320 tmp = (uint64_t) (27000000.0f / fps);
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2321 spriv->last_pts += tmp;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2322 spriv->last_dts += tmp;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2323 }
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2324 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
2325 else if(is_mpeg4(stream_format))
24902
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2326 {
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2327 spriv->is_mpeg12 = 0;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2328 spriv->telecine = 0;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2329 if(len)
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2330 sz = parse_mpeg4_video(s, priv, spriv, fps, len);
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2331 else
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2332 {
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2333 tmp = (uint64_t) (27000000.0f / fps);
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2334 spriv->last_pts += tmp;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2335 spriv->last_dts += tmp;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2336 }
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2337 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
2338
24902
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2339 mp_msg(MSGT_MUXER, MSGL_DBG2,"mpegfile_write_chunk, Video codec=%x, len=%u, mpeg12 returned %u\n", stream_format, (uint32_t) len, (uint32_t) sz);
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2340 }
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2341 else
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2342 { // MUXER_TYPE_AUDIO
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2343 double fake_timer;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2344 spriv->type = 0;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2345 stream_format = s->wf->wFormatTag;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
2346
24902
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2347 if(s->b_buffer_size - s->b_buffer_len < len)
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2348 {
24910
74ae00838094 prevent unlikely memleak
nicodvb
parents: 24909
diff changeset
2349 void *tmp;
74ae00838094 prevent unlikely memleak
nicodvb
parents: 24909
diff changeset
2350
24902
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2351 if(s->b_buffer_len > SIZE_MAX - len)
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2352 {
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2353 mp_msg(MSGT_MUXER, MSGL_FATAL, "\nFATAL! couldn't realloc, integer overflow\n");
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2354 return;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2355 }
24910
74ae00838094 prevent unlikely memleak
nicodvb
parents: 24909
diff changeset
2356 tmp = realloc(s->b_buffer, len + s->b_buffer_len);
74ae00838094 prevent unlikely memleak
nicodvb
parents: 24909
diff changeset
2357 if(!tmp)
24902
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2358 {
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2359 mp_msg(MSGT_MUXER, MSGL_FATAL, "\nFATAL! couldn't realloc %d bytes\n", len + s->b_buffer_len);
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2360 return;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2361 }
24910
74ae00838094 prevent unlikely memleak
nicodvb
parents: 24909
diff changeset
2362 s->b_buffer = tmp;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
2363
24902
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2364 s->b_buffer_size = len + s->b_buffer_len;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2365 mp_msg(MSGT_MUXER, MSGL_DBG2, "REALLOC(%d) bytes to AUDIO backbuffer\n", s->b_buffer_size);
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2366 }
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2367 memcpy(&(s->b_buffer[s->b_buffer_ptr + s->b_buffer_len]), s->buffer, len);
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2368 s->b_buffer_len += len;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
2369
24902
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2370 if(!spriv->is_ready)
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2371 {
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2372 if(s->b_buffer_len >= 32*1024)
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2373 {
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2374 spriv->mpa_layer = analyze_mpa(s);
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2375 spriv->is_ready = 1;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2376 }
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2377 }
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2378 else
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2379 {
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2380 parse_audio(s, 0, &nf, &fake_timer, priv->init_adelay, priv->drop);
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2381 spriv->vframes += nf;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2382 if(! spriv->vframes)
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
2383 mp_msg(MSGT_MUXER, MSGL_INFO, "AINIT: %.3lf\r\n", (double) spriv->last_pts/27000000.0f);
24902
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2384 }
18181
afaa492536f6 new code to simplify assignment of timestamps; removed temp_ref from mpeg_frame_t and modified add_frame() accordingly; removed no more used drop_delayed_audio() and save_delayed_audio()
nicodvb
parents: 18166
diff changeset
2385 }
8585
27da710563c2 the long-waited MUXER layer, and new MPEG-PS muxer
arpi
parents:
diff changeset
2386
24902
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2387 flush_buffers(muxer, 0);
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
2388 }
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
2389
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
2390
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
2391 static void mpegfile_write_index(muxer_t *muxer)
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
2392 {
15947
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
2393 int i, nf;
17023
dd5be8f8d16d buffering in the muxer layer; patch by Corey Hickey (bugfood-ml ad fatooh punctum org) plus small fixes by me
nicodvb
parents: 17012
diff changeset
2394 double fake_timer;
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
2395 muxer_priv_t *priv = (muxer_priv_t *) muxer->priv;
15947
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
2396
17065
cf6bfdf41143 Clean up some muxer messages, patch by Corey Hickey bugfood-ml AT -fatooh/org- , small fixes by me
reynaldo
parents: 17023
diff changeset
2397 mp_msg(MSGT_MUXER, MSGL_INFO, MSGTR_WritingTrailer);
cf6bfdf41143 Clean up some muxer messages, patch by Corey Hickey bugfood-ml AT -fatooh/org- , small fixes by me
reynaldo
parents: 17023
diff changeset
2398
15947
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
2399 for(i = 0; i < muxer->avih.dwStreams; i++)
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
2400 {
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
2401 if(muxer->streams[i]->type == MUXER_TYPE_AUDIO)
18181
afaa492536f6 new code to simplify assignment of timestamps; removed temp_ref from mpeg_frame_t and modified add_frame() accordingly; removed no more used drop_delayed_audio() and save_delayed_audio()
nicodvb
parents: 18166
diff changeset
2402 parse_audio(muxer->streams[i], 1, &nf, &fake_timer, priv->init_adelay, priv->drop);
15947
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
2403 }
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
2404 while(flush_buffers(muxer, 0) > 0);
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
2405 flush_buffers(muxer, 1);
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
2406 if(priv->is_genmpeg1 || priv->is_genmpeg2)
22917
60498e21115a 10l, the scr must be reset before overwriting the first pack with the correct system header (format=mpeg1|2)
nicodvb
parents: 22909
diff changeset
2407 {
60498e21115a 10l, the scr must be reset before overwriting the first pack with the correct system header (format=mpeg1|2)
nicodvb
parents: 22909
diff changeset
2408 priv->scr = 0;
21660
ca9da45d13e9 muxers now write to output muxer->stream rather than to muxer->file
nicodvb
parents: 21544
diff changeset
2409 write_mpeg_pack(muxer, NULL, muxer->stream, 1); //insert fake Nav Packet
22917
60498e21115a 10l, the scr must be reset before overwriting the first pack with the correct system header (format=mpeg1|2)
nicodvb
parents: 22909
diff changeset
2410 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
2411
16750
0a31740dd5e6 Use PRI?64 defines as format strings for 64 bit variables.
reimar
parents: 16192
diff changeset
2412 mp_msg(MSGT_MUXER, MSGL_INFO, "\nOverhead: %.3lf%% (%"PRIu64" / %"PRIu64")\n", 100.0 * (double)priv->headers_size / (double)priv->data_size, priv->headers_size, priv->data_size);
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
2413 }
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
2414
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
2415 static void mpegfile_write_header(muxer_t *muxer)
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
2416 {
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
2417 muxer_priv_t *priv = (muxer_priv_t*) muxer->priv;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
2418
17065
cf6bfdf41143 Clean up some muxer messages, patch by Corey Hickey bugfood-ml AT -fatooh/org- , small fixes by me
reynaldo
parents: 17023
diff changeset
2419 mp_msg(MSGT_MUXER, MSGL_INFO, MSGTR_WritingHeader);
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
2420
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
2421 priv->headers_cnt++;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
2422
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
2423 //write the first system header only for generic mpeg1/2 muxes, and only when we have collected all necessary infos
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
2424 if(priv->is_genmpeg1 || priv->is_genmpeg2 || ((priv->is_xvcd || priv->is_xsvcd) && (priv->headers_cnt == 1)))
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
2425 {
21660
ca9da45d13e9 muxers now write to output muxer->stream rather than to muxer->file
nicodvb
parents: 21544
diff changeset
2426 write_mpeg_pack(muxer, NULL, muxer->stream, 0);
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
2427 priv->update_system_header = 0;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
2428 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
2429
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
2430 return;
8585
27da710563c2 the long-waited MUXER layer, and new MPEG-PS muxer
arpi
parents:
diff changeset
2431 }
27da710563c2 the long-waited MUXER layer, and new MPEG-PS muxer
arpi
parents:
diff changeset
2432
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
2433 static void setup_sys_params(muxer_priv_t *priv)
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
2434 {
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
2435 if(priv->is_dvd)
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
2436 {
21413
06d63614eeaa permit to specify the sizes of the decoders' buffers
nicodvb
parents: 21372
diff changeset
2437 int v = (conf_vbuf_size ? conf_vbuf_size : 232);
06d63614eeaa permit to specify the sizes of the decoders' buffers
nicodvb
parents: 21372
diff changeset
2438 int a1 = (conf_abuf_size ? conf_abuf_size : 4);
06d63614eeaa permit to specify the sizes of the decoders' buffers
nicodvb
parents: 21372
diff changeset
2439 int a2 = (conf_abuf_size>58 ? conf_abuf_size : 58);
06d63614eeaa permit to specify the sizes of the decoders' buffers
nicodvb
parents: 21372
diff changeset
2440
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
2441 priv->sys_info.cnt = 4;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
2442
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
2443 priv->sys_info.streams[0].id = 0xb9;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
2444 priv->sys_info.streams[0].type = 1;
21413
06d63614eeaa permit to specify the sizes of the decoders' buffers
nicodvb
parents: 21372
diff changeset
2445 priv->sys_info.streams[0].bufsize = v*1024;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
2446
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
2447 priv->sys_info.streams[1].id = 0xb8;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
2448 priv->sys_info.streams[1].type = 0;
21413
06d63614eeaa permit to specify the sizes of the decoders' buffers
nicodvb
parents: 21372
diff changeset
2449 priv->sys_info.streams[1].bufsize = a1*1024;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
2450
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
2451 priv->sys_info.streams[2].id = 0xbd;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
2452 priv->sys_info.streams[2].type = 1;
21413
06d63614eeaa permit to specify the sizes of the decoders' buffers
nicodvb
parents: 21372
diff changeset
2453 priv->sys_info.streams[2].bufsize = a2*1024;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
2454
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
2455 priv->sys_info.streams[3].id = 0xbf;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
2456 priv->sys_info.streams[3].type = 1;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
2457 priv->sys_info.streams[3].bufsize = 2*1024;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
2458 }
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
2459 else if(priv->is_xvcd || priv->is_xsvcd)
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
2460 {
21413
06d63614eeaa permit to specify the sizes of the decoders' buffers
nicodvb
parents: 21372
diff changeset
2461 int v = (conf_vbuf_size ? conf_vbuf_size : (priv->is_xvcd ? 46: 230));
06d63614eeaa permit to specify the sizes of the decoders' buffers
nicodvb
parents: 21372
diff changeset
2462 int a1 = (conf_abuf_size ? conf_abuf_size : 4);
06d63614eeaa permit to specify the sizes of the decoders' buffers
nicodvb
parents: 21372
diff changeset
2463
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
2464 priv->sys_info.cnt = 2;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
2465
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
2466 priv->sys_info.streams[0].id = 0xe0;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
2467 priv->sys_info.streams[0].type = 1;
21413
06d63614eeaa permit to specify the sizes of the decoders' buffers
nicodvb
parents: 21372
diff changeset
2468 priv->sys_info.streams[0].bufsize = v*1024;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
2469
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
2470 priv->sys_info.streams[1].id = 0xc0;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
2471 priv->sys_info.streams[1].type = 0;
21413
06d63614eeaa permit to specify the sizes of the decoders' buffers
nicodvb
parents: 21372
diff changeset
2472 priv->sys_info.streams[1].bufsize = a1*1024;
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
2473 }
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
2474 else
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
2475 priv->sys_info.cnt = 0;
8585
27da710563c2 the long-waited MUXER layer, and new MPEG-PS muxer
arpi
parents:
diff changeset
2476 }
27da710563c2 the long-waited MUXER layer, and new MPEG-PS muxer
arpi
parents:
diff changeset
2477
21467
dd765bcd83aa added generalized teleciner by Donald Graft
nicodvb
parents: 21448
diff changeset
2478 /* excerpt from DGPulldown Copyright (C) 2005-2006, Donald Graft */
25720
333540254bb4 Put bff_mask into muxer context instead of a global variable.
reimar
parents: 25098
diff changeset
2479 static void generate_flags(uint8_t *bff_mask, int source, int target)
21467
dd765bcd83aa added generalized teleciner by Donald Graft
nicodvb
parents: 21448
diff changeset
2480 {
dd765bcd83aa added generalized teleciner by Donald Graft
nicodvb
parents: 21448
diff changeset
2481 unsigned int i, trfp;
dd765bcd83aa added generalized teleciner by Donald Graft
nicodvb
parents: 21448
diff changeset
2482 uint64_t dfl,tfl;
21481
95c9f47c1cd8 pre-store in bff_mask the correct or-mask to be saved in the pce (slightly faster)
nicodvb
parents: 21469
diff changeset
2483 unsigned char ormask[4] = {0x0, 0x2, 0x80, 0x82};
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
2484
21467
dd765bcd83aa added generalized teleciner by Donald Graft
nicodvb
parents: 21448
diff changeset
2485 dfl = (target - source) << 1;
dd765bcd83aa added generalized teleciner by Donald Graft
nicodvb
parents: 21448
diff changeset
2486 tfl = source >> 1;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
2487
21467
dd765bcd83aa added generalized teleciner by Donald Graft
nicodvb
parents: 21448
diff changeset
2488 trfp = 0;
dd765bcd83aa added generalized teleciner by Donald Graft
nicodvb
parents: 21448
diff changeset
2489 for(i = 0; i < MAX_PATTERN_LENGTH; i++)
dd765bcd83aa added generalized teleciner by Donald Graft
nicodvb
parents: 21448
diff changeset
2490 {
dd765bcd83aa added generalized teleciner by Donald Graft
nicodvb
parents: 21448
diff changeset
2491 tfl += dfl;
dd765bcd83aa added generalized teleciner by Donald Graft
nicodvb
parents: 21448
diff changeset
2492 if(tfl >= source)
dd765bcd83aa added generalized teleciner by Donald Graft
nicodvb
parents: 21448
diff changeset
2493 {
dd765bcd83aa added generalized teleciner by Donald Graft
nicodvb
parents: 21448
diff changeset
2494 tfl -= source;
21481
95c9f47c1cd8 pre-store in bff_mask the correct or-mask to be saved in the pce (slightly faster)
nicodvb
parents: 21469
diff changeset
2495 bff_mask[i] = ormask[trfp + 1];
21467
dd765bcd83aa added generalized teleciner by Donald Graft
nicodvb
parents: 21448
diff changeset
2496 trfp ^= 2;
dd765bcd83aa added generalized teleciner by Donald Graft
nicodvb
parents: 21448
diff changeset
2497 }
dd765bcd83aa added generalized teleciner by Donald Graft
nicodvb
parents: 21448
diff changeset
2498 else
21481
95c9f47c1cd8 pre-store in bff_mask the correct or-mask to be saved in the pce (slightly faster)
nicodvb
parents: 21469
diff changeset
2499 bff_mask[i] = ormask[trfp];
21467
dd765bcd83aa added generalized teleciner by Donald Graft
nicodvb
parents: 21448
diff changeset
2500 }
dd765bcd83aa added generalized teleciner by Donald Graft
nicodvb
parents: 21448
diff changeset
2501 }
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
2502
24902
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2503 int muxer_init_muxer_mpeg(muxer_t *muxer)
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2504 {
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2505 muxer_priv_t *priv;
30702
9fc9d1e788aa Do not cast the results of malloc/calloc/realloc.
diego
parents: 30633
diff changeset
2506 priv = calloc(1, sizeof(muxer_priv_t));
24902
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2507 if(priv == NULL)
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2508 return 0;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2509 priv->update_system_header = 1;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
2510
24902
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2511 //calloc() already zero-ed all flags, so we assign only the ones we need
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
2512
24902
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2513 if(conf_mux != NULL)
21467
dd765bcd83aa added generalized teleciner by Donald Graft
nicodvb
parents: 21448
diff changeset
2514 {
24902
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2515 if(! strcasecmp(conf_mux, "mpeg1"))
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2516 {
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2517 priv->mux = MUX_MPEG1;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2518 priv->packet_size = 2048;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2519 priv->is_genmpeg1 = 1;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2520 priv->muxrate = 1800 * 125; //Constrained parameters
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2521 }
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2522 else if(! strcasecmp(conf_mux, "dvd"))
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2523 {
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2524 priv->mux = MUX_MPEG2;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2525 priv->is_dvd = 1;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2526 priv->packet_size = 2048;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2527 priv->muxrate = 10080 * 125;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2528 }
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2529 else if(! strcasecmp(conf_mux, "xsvcd"))
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2530 {
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2531 priv->mux = MUX_MPEG2;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2532 priv->is_xsvcd = 1;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2533 priv->packet_size = 2324;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2534 priv->muxrate = 150*2324;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2535 priv->ts_allframes = 1;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2536 }
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2537 else if(! strcasecmp(conf_mux, "xvcd"))
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2538 {
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2539 priv->mux = MUX_MPEG1;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2540 priv->is_xvcd = 1;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2541 priv->packet_size = 2324;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2542 priv->muxrate = 75*2352;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2543 priv->ts_allframes = 1;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2544 }
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2545 else if(! strcasecmp(conf_mux, "pes1"))
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2546 {
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2547 priv->mux = MUX_MPEG1;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2548 priv->rawpes = 1;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2549 priv->packet_size = 2048;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2550 priv->muxrate = 10080 * 125;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2551 priv->ts_allframes = 1;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2552 }
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2553 else if(! strcasecmp(conf_mux, "pes2"))
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2554 {
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2555 priv->mux = MUX_MPEG2;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2556 priv->rawpes = 1;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2557 priv->packet_size = 2048;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2558 priv->muxrate = 10080 * 125;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2559 priv->ts_allframes = 1;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2560 }
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2561 else
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2562 {
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2563 if(strcasecmp(conf_mux, "mpeg2"))
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2564 mp_msg(MSGT_MUXER, MSGL_ERR, "Unknown format %s, default to mpeg2\n", conf_mux);
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2565 priv->mux = MUX_MPEG2;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2566 priv->is_genmpeg2 = 1;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2567 priv->packet_size = 2048;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2568 priv->muxrate = 1800 * 125; //Constrained parameters
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2569 }
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2570 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
2571
24902
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2572 if(conf_ts_allframes)
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2573 priv->ts_allframes = 1;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2574 if(conf_muxrate > 0)
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2575 priv->muxrate = conf_muxrate * 125; // * 1000 / 8
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2576 if(conf_packet_size)
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2577 priv->packet_size = conf_packet_size;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2578 priv->delta_scr = (uint64_t) (90000.0f*300.0f*(double)priv->packet_size/(double)priv->muxrate);
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2579 mp_msg(MSGT_MUXER, MSGL_INFO, "PACKET SIZE: %u bytes, deltascr: %"PRIu64"\n", priv->packet_size, priv->delta_scr);
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2580 setup_sys_params(priv);
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
2581
24902
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2582 if(conf_vaspect > 0)
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2583 {
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2584 int asp = (int) (conf_vaspect * 1000.0f);
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2585 if(asp >= 1332 && asp <= 1334)
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2586 priv->vaspect = ASPECT_4_3;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2587 else if(asp >= 1776 && asp <= 1778)
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2588 priv->vaspect = ASPECT_16_9;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2589 else if(asp >= 2209 && asp <= 2211)
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2590 priv->vaspect = ASPECT_2_21_1;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2591 else if(asp == 1000)
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2592 priv->vaspect = ASPECT_1_1;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2593 else
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2594 mp_msg(MSGT_MUXER, MSGL_ERR, "ERROR: unrecognized aspect %.3f\n", conf_vaspect);
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2595 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
2596
24902
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2597 priv->vframerate = 0; // no change
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2598 if(conf_telecine && conf_vframerate > 0)
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2599 {
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2600 mp_msg(MSGT_MUXER, MSGL_ERR, "ERROR: options 'telecine' and 'vframerate' are mutually exclusive, vframerate disabled\n");
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2601 conf_vframerate = 0;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2602 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
2603
24902
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2604 if(conf_telecine == TELECINE_FILM2PAL)
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2605 {
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2606 if(conf_telecine_src==0.0f) conf_telecine_src = 24000.0/1001.0;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2607 conf_telecine_dest = 25;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2608 conf_telecine = TELECINE_DGPULLDOWN;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2609 }
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2610 else if(conf_telecine == PULLDOWN32)
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2611 {
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2612 if(conf_telecine_src==0.0f) conf_telecine_src = 24000.0/1001.0;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2613 conf_telecine_dest = 30000.0/1001.0;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2614 conf_telecine = TELECINE_DGPULLDOWN;
21467
dd765bcd83aa added generalized teleciner by Donald Graft
nicodvb
parents: 21448
diff changeset
2615 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
2616
24902
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2617 if(conf_telecine_src>0 && conf_telecine_dest>0 && conf_telecine_src < conf_telecine_dest)
14914
8511347a0475 converted vframerate to CONF_TYPE_FLOAT
nicodvb
parents: 14894
diff changeset
2618 {
24902
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2619 int sfps, tfps;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
2620
24902
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2621 sfps = (int) (conf_telecine_src * 1001 + 0.5);
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2622 tfps = (int) (conf_telecine_dest * 1001 + 0.5);
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2623 if(sfps % 2 || tfps % 2)
21486
37d60df833cc disable telecining when it can't be applied
nicodvb
parents: 21485
diff changeset
2624 {
24902
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2625 sfps *= 2;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2626 tfps *= 2;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2627 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
2628
24902
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2629 if(((tfps - sfps)>>1) > sfps)
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2630 {
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2631 mp_msg(MSGT_MUXER, MSGL_ERR, "ERROR! Framerate increment must be <= 1.5, telecining disabled\n");
21486
37d60df833cc disable telecining when it can't be applied
nicodvb
parents: 21485
diff changeset
2632 conf_telecine = 0;
37d60df833cc disable telecining when it can't be applied
nicodvb
parents: 21485
diff changeset
2633 }
24902
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2634 else
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2635 {
25720
333540254bb4 Put bff_mask into muxer context instead of a global variable.
reimar
parents: 25098
diff changeset
2636 generate_flags(priv->bff_mask, sfps, tfps);
24902
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2637 conf_telecine = TELECINE_DGPULLDOWN;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2638 conf_vframerate = conf_telecine_dest;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2639 }
14914
8511347a0475 converted vframerate to CONF_TYPE_FLOAT
nicodvb
parents: 14894
diff changeset
2640 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
2641
24902
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2642 if(conf_vframerate)
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2643 {
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2644 int fps;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
2645
24902
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2646 fps = (int) (conf_vframerate * 1001 + 0.5);
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2647 switch(fps)
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2648 {
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2649 case 24000:
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2650 priv->vframerate = FRAMERATE_23976;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2651 break;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2652 case 24024:
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2653 priv->vframerate = FRAMERATE_24;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2654 break;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2655 case 25025:
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2656 priv->vframerate = FRAMERATE_25;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2657 break;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2658 case 30000:
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2659 priv->vframerate = FRAMERATE_2997;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2660 break;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2661 case 30030:
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2662 priv->vframerate = FRAMERATE_30;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2663 break;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2664 case 50050:
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2665 priv->vframerate = FRAMERATE_50;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2666 break;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2667 case 60000:
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2668 priv->vframerate = FRAMERATE_5994;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2669 break;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2670 case 60060:
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2671 priv->vframerate = FRAMERATE_60;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2672 break;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2673 default:
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2674 {
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2675 mp_msg(MSGT_MUXER, MSGL_ERR, "WRONG FPS: %d/1000, ignoring\n", fps);
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2676 if(conf_telecine)
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2677 mp_msg(MSGT_MUXER, MSGL_ERR, "DISABLED TELECINING\n");
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2678 conf_telecine = 0;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2679 }
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2680 }
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2681 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
2682
24902
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2683 priv->vwidth = (uint16_t) conf_vwidth;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2684 priv->vheight = (uint16_t) conf_vheight;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2685 priv->panscan_width = (uint16_t) conf_panscan_width;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2686 priv->panscan_height = (uint16_t) conf_panscan_height;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2687 priv->vbitrate = ((conf_vbitrate) * 10) >> 2; //*1000 / 400
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
2688
24902
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2689 if(priv->vaspect || priv->vframerate || priv->vwidth || priv->vheight || priv->vbitrate || priv->panscan_width || priv->panscan_height)
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2690 {
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2691 priv->patch_seq = priv->vaspect || priv->vframerate || priv->vwidth || priv->vheight || priv->vbitrate;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2692 priv->patch_sde = priv->panscan_width || priv->panscan_height;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2693 mp_msg(MSGT_MUXER, MSGL_INFO, "MPEG MUXER, patching");
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2694 if(priv->vwidth || priv->vheight)
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2695 mp_msg(MSGT_MUXER, MSGL_INFO, " resolution to %dx%d", priv->vwidth, priv->vheight);
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2696 if(priv->panscan_width || priv->panscan_height)
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2697 mp_msg(MSGT_MUXER, MSGL_INFO, " panscan to to %dx%d", priv->panscan_width, priv->panscan_height);
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2698 if(priv->vframerate)
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2699 mp_msg(MSGT_MUXER, MSGL_INFO, " framerate to %s fps", framerates[priv->vframerate]);
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2700 if(priv->vaspect)
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2701 mp_msg(MSGT_MUXER, MSGL_INFO, " aspect ratio to %s", aspect_ratios[priv->vaspect]);
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2702 if(priv->vbitrate)
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2703 mp_msg(MSGT_MUXER, MSGL_INFO, " bitrate to %u", conf_vbitrate);
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2704 mp_msg(MSGT_MUXER, MSGL_INFO, "\n");
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2705 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
2706
24902
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2707 priv->has_video = priv->has_audio = 0;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
2708
24902
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2709 muxer->sysrate = priv->muxrate; // initial muxrate = constrained stream parameter
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2710 priv->scr = muxer->file_end = 0;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
2711
24902
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2712 if(conf_init_vdelay && conf_drop)
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2713 {
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2714 mp_msg(MSGT_MUXER, MSGL_ERR, "\nmuxer_mpg, :drop and :vdelay used together are not supported, exiting\n");
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2715 return 0;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2716 }
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2717 if(conf_init_adelay)
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2718 priv->init_adelay = - (double) conf_init_adelay / (double) 1000.0;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
2719
24902
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2720 priv->drop = conf_drop;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
2721
30702
9fc9d1e788aa Do not cast the results of malloc/calloc/realloc.
diego
parents: 30633
diff changeset
2722 priv->buff = malloc(priv->packet_size);
24902
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2723 if((priv->buff == NULL))
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2724 {
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2725 mp_msg(MSGT_MUXER, MSGL_ERR, "\nCouldn't allocate %d bytes, exit\n", priv->packet_size);
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2726 return 0;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2727 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
2728
24902
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2729 muxer->priv = (void *) priv;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2730 muxer->cont_new_stream = &mpegfile_new_stream;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2731 muxer->cont_write_chunk = &mpegfile_write_chunk;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2732 muxer->cont_write_header = &mpegfile_write_header;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2733 muxer->cont_write_index = &mpegfile_write_index;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2734 muxer->fix_stream_parameters = &fix_parameters;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2735 return 1;
8585
27da710563c2 the long-waited MUXER layer, and new MPEG-PS muxer
arpi
parents:
diff changeset
2736 }