annotate libmpdemux/muxer_mpeg.c @ 32537:8fa2f43cb760

Remove most of the NULL pointer check before free all over the code
author cboesch
date Sun, 14 Nov 2010 09:12:34 +0000
parents 76f94c00a69f
children de37221dff02
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
31618
9318ad289bb0 Use AV_WB* where possible and be2me -> be2ne compilation fix.
reimar
parents: 31090
diff changeset
29 #include "libavutil/intreadwrite.h"
12341
0db4a3a5b01d removed loader/ dependancy, imported some files from g2, also used patches from Dominik Mierzejewski
alex
parents: 11223
diff changeset
30 #include "aviheader.h"
0db4a3a5b01d removed loader/ dependancy, imported some files from g2, also used patches from Dominik Mierzejewski
alex
parents: 11223
diff changeset
31 #include "ms_hdr.h"
0db4a3a5b01d removed loader/ dependancy, imported some files from g2, also used patches from Dominik Mierzejewski
alex
parents: 11223
diff changeset
32
22605
4d81dbdf46b9 Add explicit location for headers from the stream/ directory.
diego
parents: 22333
diff changeset
33 #include "stream/stream.h"
8585
27da710563c2 the long-waited MUXER layer, and new MPEG-PS muxer
arpi
parents:
diff changeset
34 #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
35 #include "demuxer.h"
30576
24a5dc9d1466 Add separate header for mp_a52_framesize(); avoids forward declarations.
diego
parents: 30574
diff changeset
36 #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
37 #include "stheader.h"
17012
6ff3379a0862 Unify include path handling, -I.. is in CFLAGS.
diego
parents: 16750
diff changeset
38 #include "m_option.h"
30574
928359c13d93 Add separate header for aac_parse_frame(); avoids forward declarations.
diego
parents: 29263
diff changeset
39 #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
40 #include "mpeg_hdr.h"
17091
rathann
parents: 17066
diff changeset
41 #include "mp3_hdr.h"
31864
d277ede2b207 Add missing header for mp_a52_framesize, fixes the warning:
diego
parents: 31799
diff changeset
42 #include "parse_es.h"
31089
459227551819 Use the system liba52 headers when internal liba52 is disabled, fixes:
diego
parents: 30958
diff changeset
43
8585
27da710563c2 the long-waited MUXER layer, and new MPEG-PS muxer
arpi
parents:
diff changeset
44
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
45 #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
46 #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
47 #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
48
70c446099f40 new mpeg 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 #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
50 #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
51
70c446099f40 new mpeg 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 #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
53 #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
54
70c446099f40 new mpeg 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 #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
56 #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
57 #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
58 #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
59 #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
60 #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
61 #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
62 //#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
63 #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
64
70c446099f40 new mpeg 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 #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
66 #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
67 #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
68 #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
69
70c446099f40 new mpeg 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 #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
71 #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
72 #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
73 #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
74 #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
75 #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
76 #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
77 #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
78
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
79 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
80 #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
81
70c446099f40 new mpeg 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 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
83 "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
84 };
70c446099f40 new mpeg 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 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
87 "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
88 };
70c446099f40 new mpeg 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 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
91 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
92 static uint32_t conf_muxrate = 0; //kb/s
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
93 static float conf_vaspect = 0;
14914
8511347a0475 converted vframerate to CONF_TYPE_FLOAT
nicodvb
parents: 14894
diff changeset
94 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
95 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
96 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
97 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
98 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
99 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
100 static int conf_abuf_size = 0;
06d63614eeaa permit to specify the sizes of the decoders' buffers
nicodvb
parents: 21372
diff changeset
101 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
102 static int conf_drop = 0;
14840
d49482c5d8ac soft telecine support! :)) patch by nico
rfelker
parents: 14809
diff changeset
103 static int conf_telecine = 0;
22929
a60dbae6ee1d added :interleaving2, a better method to determine which stream whouls be flushed
nicodvb
parents: 22927
diff changeset
104 static int conf_interleaving2 = 0;
21467
dd765bcd83aa added generalized teleciner by Donald Graft
nicodvb
parents: 21448
diff changeset
105 static float conf_telecine_src = 0;
dd765bcd83aa added generalized teleciner by Donald Graft
nicodvb
parents: 21448
diff changeset
106 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
107
70c446099f40 new mpeg 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 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
109 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
110 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
111 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
112 };
8585
27da710563c2 the long-waited MUXER layer, and new MPEG-PS muxer
arpi
parents:
diff changeset
113
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
114 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
115 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
116 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
117 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
118 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
119 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
120 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
121 } 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
122
70c446099f40 new mpeg 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 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
124 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
125 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
126 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
127 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
128 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
129 } 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
130 } 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
131
70c446099f40 new mpeg 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 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
133 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
134 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
135 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
136 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
137 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
138 } 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
139 } 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
140
18183
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
141 typedef struct {
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
142 int size;
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
143 uint64_t dts;
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
144 } 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
145
70c446099f40 new mpeg 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 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
147 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
148 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
149 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
150 } 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
151
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 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
153 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
154 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
155 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
156 uint16_t packet_size;
21141
33cce0f7e66c permit muxing to raw pes (VDR uses this)
nicodvb
parents: 20344
diff changeset
157 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
158 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
159 off_t headers_size, data_size;
18200
b8a94743afec removed more unused code and struct members
nicodvb
parents: 18199
diff changeset
160 uint64_t scr;
18183
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
161 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
162 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
163 uint32_t muxrate;
18200
b8a94743afec removed more unused code and struct members
nicodvb
parents: 18199
diff changeset
164 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
165 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
166 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
167 int drop;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
168
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
169 //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
170 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
171 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
172 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
173 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
174 int psm_streams_cnt;
25720
333540254bb4 Put bff_mask into muxer context instead of a global variable.
reimar
parents: 25098
diff changeset
175
333540254bb4 Put bff_mask into muxer context instead of a global variable.
reimar
parents: 25098
diff changeset
176 //2 million frames are enough
333540254bb4 Put bff_mask into muxer context instead of a global variable.
reimar
parents: 25098
diff changeset
177 #define MAX_PATTERN_LENGTH 2000000
333540254bb4 Put bff_mask into muxer context instead of a global variable.
reimar
parents: 25098
diff changeset
178 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
179 } 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
180
70c446099f40 new mpeg 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 typedef struct {
24906
e3fec0def910 removed no more needed variable
nicodvb
parents: 24905
diff changeset
183 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
184 int delay_rff;
18200
b8a94743afec removed more unused code and struct members
nicodvb
parents: 18199
diff changeset
185 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
186 uint32_t buffer_size;
18200
b8a94743afec removed more unused code and struct members
nicodvb
parents: 18199
diff changeset
187 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
188 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
189 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
190 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
191 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
192 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
193 int max_tr;
17301
bbf5438d646a removed previously forgotten reording options/flags
nicodvb
parents: 17298
diff changeset
194 uint8_t id, is_mpeg12, telecine;
14840
d49482c5d8ac soft telecine support! :)) patch by nico
rfelker
parents: 14809
diff changeset
195 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
196 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
197 mp_mpeg_header_t picture;
18183
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
198 int max_buffer_size;
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
199 buffer_track_t *buffer_track;
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
200 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
201 unsigned char *pack;
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
202 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
203 int frames;
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
204 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
205 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
206 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
207 } 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
208
17600
6fa1149d8c80 experimental film2pal and ntsc2pal soft teleciner
nicodvb
parents: 17591
diff changeset
209 #define PULLDOWN32 1
6fa1149d8c80 experimental film2pal and ntsc2pal soft teleciner
nicodvb
parents: 17591
diff changeset
210 #define TELECINE_FILM2PAL 2
21467
dd765bcd83aa added generalized teleciner by Donald Graft
nicodvb
parents: 21448
diff changeset
211 #define TELECINE_DGPULLDOWN 3
8585
27da710563c2 the long-waited MUXER layer, and new MPEG-PS muxer
arpi
parents:
diff changeset
212
30958
d05a77bed63f Mark muxer-related m_option_t arrays as const.
diego
parents: 30702
diff changeset
213 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
214 {"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
215 {"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
216 {"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
217 {"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
218 {"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
219 {"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
220 {"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
221 {"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
222 {"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
223 {"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
224 {"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
225 {"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
226 {"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
227 {"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
228 {"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
229 {"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
230 {"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
231 {"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
232 {"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
233 {"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
234 {"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
235 {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
236 };
70c446099f40 new mpeg 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 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
239 {
70c446099f40 new mpeg 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 uint8_t i;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
241
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
242 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
243 {
70c446099f40 new mpeg 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 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
245 {
70c446099f40 new mpeg 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 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
247 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
248 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
249 }
70c446099f40 new mpeg 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 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
254 {
26758
9fb1d2c3dbd4 cosmetics: Remove pointless parentheses from return statements.
diego
parents: 26570
diff changeset
255 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
256 (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
257 (x == mmioFOURCC('m','p','g','1')) ||
26758
9fb1d2c3dbd4 cosmetics: Remove pointless parentheses from return statements.
diego
parents: 26570
diff changeset
258 (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
259 }
70c446099f40 new mpeg 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 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
262 {
26758
9fb1d2c3dbd4 cosmetics: Remove pointless parentheses from return statements.
diego
parents: 26570
diff changeset
263 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
264 (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
265 (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
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','e','g')) ||
26758
9fb1d2c3dbd4 cosmetics: Remove pointless parentheses from return statements.
diego
parents: 26570
diff changeset
268 (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
269 }
8585
27da710563c2 the long-waited MUXER layer, and new MPEG-PS muxer
arpi
parents:
diff changeset
270
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
271 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
272 {
26758
9fb1d2c3dbd4 cosmetics: Remove pointless parentheses from return statements.
diego
parents: 26570
diff changeset
273 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
274 (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
275 (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
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('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
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','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
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('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
283 (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
284 (x == mmioFOURCC('F', 'M','P','4')) ||
18164
c692440493c8 added support for DX50 and dx50 4CCs
nicodvb
parents: 18163
diff changeset
285 (x == mmioFOURCC('f', 'm','p','4')) ||
c692440493c8 added support for DX50 and dx50 4CCs
nicodvb
parents: 18163
diff changeset
286 (x == mmioFOURCC('D', 'X','5','0')) ||
26758
9fb1d2c3dbd4 cosmetics: Remove pointless parentheses from return statements.
diego
parents: 26570
diff changeset
287 (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
288 }
70c446099f40 new mpeg 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 //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
291 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
292 {
70c446099f40 new mpeg 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 uint32_t i, j, CRCTab[256], crc;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
294
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
295 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
296 {
70c446099f40 new mpeg 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 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
298 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
299 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
300 }
70c446099f40 new mpeg 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
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
302
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
303 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
304 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
305 crc = (crc << 8) ^ CRCTab[((crc >> 24) ^ buff[i]) & 0xff];
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
306
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
307 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
308 }
70c446099f40 new mpeg 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 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
312 {
70c446099f40 new mpeg 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 uint8_t i;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
314
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
315 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
316 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
317 priv->psm_info.streams[i].format = format;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
318
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
319 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
320 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
321 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
322 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
323 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
324 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
325 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
326 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
327 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
328 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
329 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
330 priv->psm_info.streams[i].type = 0x81;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
331
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
332 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
333 memcpy((char*) &(priv->psm_info.streams[i].format), "AC-3", 4);
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
334
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
335 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
336 }
70c446099f40 new mpeg 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 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
340 {
70c446099f40 new mpeg 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 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
342 uint16_t i;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
343
30702
9fc9d1e788aa Do not cast the results of malloc/calloc/realloc.
diego
parents: 30633
diff changeset
344 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
345 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
346 return NULL;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
347
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
348 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
349 {
30702
9fc9d1e788aa Do not cast the results of malloc/calloc/realloc.
diego
parents: 30633
diff changeset
350 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
351 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
352 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
353 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
354 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
355 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
356 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
357 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
358
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
359 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
360 }
70c446099f40 new mpeg 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
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
362 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
363
27da710563c2 the long-waited MUXER layer, and new MPEG-PS muxer
arpi
parents:
diff changeset
364 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
365 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
366 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
367 muxer_headers_t *spriv;
8585
27da710563c2 the long-waited MUXER layer, and new MPEG-PS muxer
arpi
parents:
diff changeset
368
9007
12fc55eb3373 Cleanup of the muxer API, func parameters muxer & muxer_f eliminated.
arpi
parents: 8585
diff changeset
369 if (!muxer) return NULL;
8585
27da710563c2 the long-waited MUXER layer, and new MPEG-PS muxer
arpi
parents:
diff changeset
370 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
371 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
372 return NULL;
27da710563c2 the long-waited MUXER layer, and new MPEG-PS muxer
arpi
parents:
diff changeset
373 }
27da710563c2 the long-waited MUXER layer, and new MPEG-PS muxer
arpi
parents:
diff changeset
374 switch (type) {
27da710563c2 the long-waited MUXER layer, and new MPEG-PS muxer
arpi
parents:
diff changeset
375 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
376 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
377 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
378 return NULL;
27da710563c2 the long-waited MUXER layer, and new MPEG-PS muxer
arpi
parents:
diff changeset
379 }
27da710563c2 the long-waited MUXER layer, and new MPEG-PS muxer
arpi
parents:
diff changeset
380 break;
27da710563c2 the long-waited MUXER layer, and new MPEG-PS muxer
arpi
parents:
diff changeset
381 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
382 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
383 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
384 return NULL;
27da710563c2 the long-waited MUXER layer, and new MPEG-PS muxer
arpi
parents:
diff changeset
385 }
27da710563c2 the long-waited MUXER layer, and new MPEG-PS muxer
arpi
parents:
diff changeset
386 break;
27da710563c2 the long-waited MUXER layer, and new MPEG-PS muxer
arpi
parents:
diff changeset
387 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
388 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
389 return NULL;
27da710563c2 the long-waited MUXER layer, and new MPEG-PS muxer
arpi
parents:
diff changeset
390 }
30702
9fc9d1e788aa Do not cast the results of malloc/calloc/realloc.
diego
parents: 30633
diff changeset
391 s = calloc(1, sizeof(muxer_stream_t));
8585
27da710563c2 the long-waited MUXER layer, and new MPEG-PS muxer
arpi
parents:
diff changeset
392 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
393 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
394 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
395 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
396 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
397 s->b_buffer_len = 0;
30702
9fc9d1e788aa Do not cast the results of malloc/calloc/realloc.
diego
parents: 30633
diff changeset
398 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
399 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
400 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
401 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
402 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
403 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
404 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
405 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
406 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
407 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
408 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
409 spriv->track_len = 4096;
8585
27da710563c2 the long-waited MUXER layer, and new MPEG-PS muxer
arpi
parents:
diff changeset
410 muxer->streams[muxer->avih.dwStreams]=s;
27da710563c2 the long-waited MUXER layer, and new MPEG-PS muxer
arpi
parents:
diff changeset
411 s->type=type;
27da710563c2 the long-waited MUXER layer, and new MPEG-PS muxer
arpi
parents:
diff changeset
412 s->id=muxer->avih.dwStreams;
9007
12fc55eb3373 Cleanup of the muxer API, func parameters muxer & muxer_f eliminated.
arpi
parents: 8585
diff changeset
413 s->muxer=muxer;
22879
910cdc3f2afb cosmetics: removed trailing spaces
nicodvb
parents: 22861
diff changeset
414
11223
b677b25a898d update by Andriy N. Gritsenko <andrej@lucky.net>
alex
parents: 9007
diff changeset
415 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
416 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
417 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
418 if(conf_init_vdelay) {
2d01760be338 removed init_apts and init_vpts; added :adelay in addition to :vdelay
nicodvb
parents: 22879
diff changeset
419 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
420 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
421 }
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
422 spriv->id = 0xe0 + muxer->num_videos;
31623
4d4ed6c9039c Fix some remaining bswap-related compilation issues.
reimar
parents: 31618
diff changeset
423 s->ckid = av_be2ne32(0x100 + spriv->id);
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
424 if(priv->is_genmpeg1 || priv->is_genmpeg2) {
21413
06d63614eeaa permit to specify the sizes of the decoders' buffers
nicodvb
parents: 21372
diff changeset
425 int v = (conf_vbuf_size ? conf_vbuf_size*1024 :
06d63614eeaa permit to specify the sizes of the decoders' buffers
nicodvb
parents: 21372
diff changeset
426 (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
427 int n = priv->sys_info.cnt;
22879
910cdc3f2afb cosmetics: removed trailing spaces
nicodvb
parents: 22861
diff changeset
428
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
429 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
430 priv->sys_info.streams[n].type = 1;
21413
06d63614eeaa permit to specify the sizes of the decoders' buffers
nicodvb
parents: 21372
diff changeset
431 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
432 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
433 }
11223
b677b25a898d update by Andriy N. Gritsenko <andrej@lucky.net>
alex
parents: 9007
diff changeset
434 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
435 priv->has_video++;
11223
b677b25a898d update by Andriy N. Gritsenko <andrej@lucky.net>
alex
parents: 9007
diff changeset
436 s->h.fccType=streamtypeVIDEO;
b677b25a898d update by Andriy N. Gritsenko <andrej@lucky.net>
alex
parents: 9007
diff changeset
437 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
438 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
439 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
440 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
441 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
442 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
443 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
444 }
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
445 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
446 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
447 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
448 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
449 spriv->min_pes_hlen = 22;
14840
d49482c5d8ac soft telecine support! :)) patch by nico
rfelker
parents: 14809
diff changeset
450 spriv->telecine = conf_telecine;
11223
b677b25a898d update by Andriy N. Gritsenko <andrej@lucky.net>
alex
parents: 9007
diff changeset
451 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
452 } 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
453 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
454 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
455 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
456 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
457 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
458 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
459 spriv->id = 0xc0 + muxer->num_audios;
31623
4d4ed6c9039c Fix some remaining bswap-related compilation issues.
reimar
parents: 31618
diff changeset
460 s->ckid = av_be2ne32(0x100 + spriv->id);
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
461 if(priv->is_genmpeg1 || priv->is_genmpeg2) {
21413
06d63614eeaa permit to specify the sizes of the decoders' buffers
nicodvb
parents: 21372
diff changeset
462 int a1 = (conf_abuf_size ? conf_abuf_size*1024 :
06d63614eeaa permit to specify the sizes of the decoders' buffers
nicodvb
parents: 21372
diff changeset
463 (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
464 int n = priv->sys_info.cnt;
22879
910cdc3f2afb cosmetics: removed trailing spaces
nicodvb
parents: 22861
diff changeset
465
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
466 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
467 priv->sys_info.streams[n].type = 0;
21413
06d63614eeaa permit to specify the sizes of the decoders' buffers
nicodvb
parents: 21372
diff changeset
468 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
469 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
470 }
70c446099f40 new mpeg 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 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
472 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
473 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
474 spriv->min_pes_hlen = 17;
22879
910cdc3f2afb cosmetics: removed trailing spaces
nicodvb
parents: 22861
diff changeset
475
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
476 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
477 priv->has_audio++;
11223
b677b25a898d update by Andriy N. Gritsenko <andrej@lucky.net>
alex
parents: 9007
diff changeset
478 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
479
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 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
481 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
482 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
483 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
484 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
485 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
486 }
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
11223
b677b25a898d update by Andriy N. Gritsenko <andrej@lucky.net>
alex
parents: 9007
diff changeset
488 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
489 }
8585
27da710563c2 the long-waited MUXER layer, and new MPEG-PS muxer
arpi
parents:
diff changeset
490 muxer->avih.dwStreams++;
27da710563c2 the long-waited MUXER layer, and new MPEG-PS muxer
arpi
parents:
diff changeset
491 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
492
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 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
494 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
495 {
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 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
497 {
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 spriv = s->priv;
32537
8fa2f43cb760 Remove most of the NULL pointer check before free all over the code
cboesch
parents: 32352
diff changeset
499 free(spriv->pack);
8fa2f43cb760 Remove most of the NULL pointer check before free all over the code
cboesch
parents: 32352
diff changeset
500 free(spriv->buffer_track);
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
501 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
502 }
32537
8fa2f43cb760 Remove most of the NULL pointer check before free all over the code
cboesch
parents: 32352
diff changeset
503 free(s->b_buffer);
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
504 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
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 return NULL;
8585
27da710563c2 the long-waited MUXER layer, and new MPEG-PS muxer
arpi
parents:
diff changeset
507 }
27da710563c2 the long-waited MUXER layer, and new MPEG-PS muxer
arpi
parents:
diff changeset
508
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
509 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
510 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
511 b[0] = mod | ((ts >> 29) & 0xf) | 1;
8585
27da710563c2 the long-waited MUXER layer, and new MPEG-PS muxer
arpi
parents:
diff changeset
512 b[1] = (ts >> 22) & 0xff;
27da710563c2 the long-waited MUXER layer, and new MPEG-PS muxer
arpi
parents:
diff changeset
513 b[2] = ((ts >> 14) & 0xff) | 1;
27da710563c2 the long-waited MUXER layer, and new MPEG-PS muxer
arpi
parents:
diff changeset
514 b[3] = (ts >> 7) & 0xff;
27da710563c2 the long-waited MUXER layer, and new MPEG-PS muxer
arpi
parents:
diff changeset
515 b[4] = ((ts << 1) & 0xff) | 1;
27da710563c2 the long-waited MUXER layer, and new MPEG-PS muxer
arpi
parents:
diff changeset
516 }
27da710563c2 the long-waited MUXER layer, and new MPEG-PS muxer
arpi
parents:
diff changeset
517
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
518
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
519 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
520 {
22924
4822223d8425 small syntax fix: muxrate is expressed in units of 400 bits/second, not 50 bytes per second
nicodvb
parents: 22917
diff changeset
521 rate = ((rate*8)+399) / 400;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
522
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
523 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
524 {
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
525 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
526 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
527 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
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 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
530 {
70c446099f40 new mpeg 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[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
532 b[1] = (rate >> 6) & 0xff;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
533 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
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 }
70c446099f40 new mpeg 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
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
537
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
538 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
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 //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
541 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
542 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
543 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
544 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
545
70c446099f40 new mpeg 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 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
547 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
548
70c446099f40 new mpeg 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 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
550 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
551 }
70c446099f40 new mpeg 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
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
553 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
554 {
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
555 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
556 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
557 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
558 ts &= 0x1FFFFFFFFULL; //33 bits
28576
a6b506faeb34 Replace double semicolon by single semicolon.
diego
parents: 28051
diff changeset
559 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
560 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
561 t3 = ts & 0x7fff;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
562
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
563 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
564 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
565 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
566 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
567 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
568 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
569 }
70c446099f40 new mpeg 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
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
571
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
572 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
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 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
575 muxer_priv_t *priv;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
576
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
577 priv = (muxer_priv_t *) muxer->priv;
31618
9318ad289bb0 Use AV_WB* where possible and be2me -> be2ne compilation fix.
reimar
parents: 31090
diff changeset
578 AV_WB32(buff, PACK_HEADER_START_CODE);
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
579 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
580 {
70c446099f40 new mpeg 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 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
582 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
583 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
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 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
586 {
70c446099f40 new mpeg 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 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
588 write_mpeg_rate(priv->mux, &buff[10], muxer->sysrate);
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
589 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
590 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
591 }
70c446099f40 new mpeg 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
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
593 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
594 }
70c446099f40 new mpeg 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 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
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 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
600 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
601 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
602 priv = (muxer_priv_t *) muxer->priv;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
603
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
604 len = 0;
31618
9318ad289bb0 Use AV_WB* where possible and be2me -> be2ne compilation fix.
reimar
parents: 31090
diff changeset
605 AV_WB32(&buff[len], SYSTEM_HEADER_START_CODE);
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
606 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
607 *(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
608 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
609 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
610 len += 3;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
611
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
612 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
613 //stolen from libavformat
a8f534c4e071 in the system header set audio_locked/video_locked only for dvd and vcd
nicodvb
parents: 22924
diff changeset
614 if(priv->is_xvcd || priv->is_dvd)
22926
92c92f168648 reindentation
nicodvb
parents: 22925
diff changeset
615 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
616 else
22926
92c92f168648 reindentation
nicodvb
parents: 22925
diff changeset
617 buff[len++] = 0x21; //marker, 1 video stream bound
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
618
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
619 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
620
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
621 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
622 {
70c446099f40 new mpeg 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->sys_info.streams[i].id;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
624 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
625 (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
626 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
627 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
628
31618
9318ad289bb0 Use AV_WB* where possible and be2me -> be2ne compilation fix.
reimar
parents: 31090
diff changeset
629 AV_WB16(&buff[4], len - 6); // length field fixed
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
630
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
631 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
632 }
70c446099f40 new mpeg 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
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
634 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
635 {
70c446099f40 new mpeg 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 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
637 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
638 uint16_t dlen;
31618
9318ad289bb0 Use AV_WB* where possible and be2me -> be2ne compilation fix.
reimar
parents: 31090
diff changeset
639 uint32_t crc;
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
640 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
641 priv = (muxer_priv_t *) muxer->priv;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
642
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
643 len = 0;
31618
9318ad289bb0 Use AV_WB* where possible and be2me -> be2ne compilation fix.
reimar
parents: 31090
diff changeset
644 AV_WB32(&buff[len], PSM_START_CODE);
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
645 len += 4;
31618
9318ad289bb0 Use AV_WB* where possible and be2me -> be2ne compilation fix.
reimar
parents: 31090
diff changeset
646 AV_WB16(&buff[len], 0); //fake length, we'll fix it later
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
647 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
648 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
649 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
650 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
651 len += 2;
31618
9318ad289bb0 Use AV_WB* where possible and be2me -> be2ne compilation fix.
reimar
parents: 31090
diff changeset
652 AV_WB16(&buff[len], 0); //length of the es descriptors
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
653 len += 2;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
654
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
655 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
656 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
657 {
70c446099f40 new mpeg 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 if(
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
659 (priv->psm_info.streams[i].id == 0xbd) ||
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
660 (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
661 (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
662 )
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
663 {
70c446099f40 new mpeg 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 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
665 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
666 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
667 buff[len++] = 0; //... lower
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
668
24903
b4cdc74f4496 remove the registration descriptor from the PSM: writing the fourcc in it makes it total crap
nicodvb
parents: 24902
diff changeset
669 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
670 }
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
671 }
31618
9318ad289bb0 Use AV_WB* where possible and be2me -> be2ne compilation fix.
reimar
parents: 31090
diff changeset
672 AV_WB16(&buff[10], dlen); //length of the es descriptors
9318ad289bb0 Use AV_WB* where possible and be2me -> be2ne compilation fix.
reimar
parents: 31090
diff changeset
673
9318ad289bb0 Use AV_WB* where possible and be2me -> be2ne compilation fix.
reimar
parents: 31090
diff changeset
674 AV_WB16(&buff[4], len - 6 + 4); // length field fixed, including size of CRC32
9318ad289bb0 Use AV_WB* where possible and be2me -> be2ne compilation fix.
reimar
parents: 31090
diff changeset
675
9318ad289bb0 Use AV_WB* where possible and be2me -> be2ne compilation fix.
reimar
parents: 31090
diff changeset
676 crc = CalcCRC32(buff, len);
9318ad289bb0 Use AV_WB* where possible and be2me -> be2ne compilation fix.
reimar
parents: 31090
diff changeset
677 AV_WB32(&buff[len], crc);
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
678
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
679 len += 4; //for crc
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 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
682 }
70c446099f40 new mpeg 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
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
684 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
685 {
26758
9fb1d2c3dbd4 cosmetics: Remove pointless parentheses from return statements.
diego
parents: 26570
diff changeset
686 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
687 }
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
688
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
689 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
690 {
70c446099f40 new mpeg 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 int len;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
692
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
693 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
694 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
695 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
696
70c446099f40 new mpeg 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 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
698 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
699
70c446099f40 new mpeg 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 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
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(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
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 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
705 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
706 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
707
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
708 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
709 {
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
710 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
711 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
712 }
70c446099f40 new mpeg 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 }
70c446099f40 new mpeg 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 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
715 {
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
716 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
717 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
718 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
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->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
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 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
723
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
724
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
725 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
726 {
70c446099f40 new mpeg 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 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
728 len += 5;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
729
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
730 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
731 {
70c446099f40 new mpeg 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 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
733 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
734 }
70c446099f40 new mpeg 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 }
70c446099f40 new mpeg 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 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
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 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
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 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
741 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
742 }
70c446099f40 new mpeg 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 }
70c446099f40 new mpeg 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
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
745
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
746 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
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(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
749 {
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
750 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
751 len++;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
752
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 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
754 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
755 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
756
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
757 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
758 {
70c446099f40 new mpeg 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 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
760 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
761 }
70c446099f40 new mpeg 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 }
70c446099f40 new mpeg 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
31618
9318ad289bb0 Use AV_WB* where possible and be2me -> be2ne compilation fix.
reimar
parents: 31090
diff changeset
764 AV_WB16(&buff[4], 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
765 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
766 }
70c446099f40 new mpeg 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
70c446099f40 new mpeg 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 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
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 //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
772 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
773 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
774 buff[3] = 0xbe;
31618
9318ad289bb0 Use AV_WB* where possible and be2me -> be2ne compilation fix.
reimar
parents: 31090
diff changeset
775 AV_WB16(&buff[4], 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
776 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
777 }
70c446099f40 new mpeg 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
70c446099f40 new mpeg 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 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
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 // 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
783 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
784
15278
a45c7e1b998f added support for AAC; moved most of MSGL_V to MSGL_DBG2 to reduce verbosity
nicodvb
parents: 15083
diff changeset
785 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
786 len = 0;
31618
9318ad289bb0 Use AV_WB* where possible and be2me -> be2ne compilation fix.
reimar
parents: 31090
diff changeset
787 AV_WB32(&buff[len], PES_PRIVATE2);
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 += 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
789 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
790 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
791 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
792 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
793
31618
9318ad289bb0 Use AV_WB* where possible and be2me -> be2ne compilation fix.
reimar
parents: 31090
diff changeset
794 AV_WB32(&buff[len], PES_PRIVATE2);
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
795 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
796 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
797 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
798 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
799 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
800
70c446099f40 new mpeg 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 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
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
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
804 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
805 {
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 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
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
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
809 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
810 {
70c446099f40 new mpeg 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 uint32_t len;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
812
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
813 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
814 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
815 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
816 len = 9;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
817
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
818 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
819 {
70c446099f40 new mpeg 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 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
821 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
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 }
70c446099f40 new mpeg 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 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
825 len += 1;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
826
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
827 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
828 {
70c446099f40 new mpeg 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(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
830 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
831 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
832 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
833 }
70c446099f40 new mpeg 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
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
835 //len = max(h->min_pes_hlen, len);
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
836
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
837 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
838 }
70c446099f40 new mpeg 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
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
840
21660
ca9da45d13e9 muxers now write to output muxer->stream rather than to muxer->file
nicodvb
parents: 21544
diff changeset
841 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
842 {
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
843 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
844 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
845 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
846 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
847
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
848 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
849 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
850
70c446099f40 new mpeg 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 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
852 {
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
853 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
854 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
855 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
856 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
857 buff[offset + 3] = 0xb9;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
858
21660
ca9da45d13e9 muxers now write to output muxer->stream rather than to muxer->file
nicodvb
parents: 21544
diff changeset
859 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
860 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
861 }
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
862 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
863 {
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
864 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
865 offset += write_mpeg_system_header(muxer, &buff[offset]);
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
866
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
867 //priv->update_system_header = 0;
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 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
870 offset += write_nav_pack(&buff[offset]);
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
871
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
872 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
873 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
874 {
70c446099f40 new mpeg 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 //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
876 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
877 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
878 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
879
21660
ca9da45d13e9 muxers now write to output muxer->stream rather than to muxer->file
nicodvb
parents: 21544
diff changeset
880 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
881 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
882 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
883 muxer->movi_end += tot;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
884
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
885 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
886 }
70c446099f40 new mpeg 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 }
70c446099f40 new mpeg 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
22142
84f95595f31f Fix a few gcc warnings, approved by Diego and Reimar.
rathann
parents: 21660
diff changeset
889 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
890 {
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
891 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
892
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
893 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
894 {
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
895 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
896 if(!tmp)
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
897 {
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
898 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
899 return;
18183
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
900 }
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
901 spriv->buffer_track = tmp;
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
902 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
903 spriv->track_len += 16;
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
904 }
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
905
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
906 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
907 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
908
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
909 spriv->track_pos++;
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
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
912 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
913 {
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 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
915 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
916
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 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
918 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
919 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
920 {
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 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
922 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
923 }
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 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
925 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
926 }
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
18197
5b06a0b9908e moved inline at beginning of declaration
nicodvb
parents: 18196
diff changeset
928 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
929 {
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
930 mpeg_frame_t tmp;
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
931 int i;
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
932
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
933 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
934 {
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
935 tmp = spriv->framebuf[i - n];
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
936 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
937 spriv->framebuf[i] = tmp;
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
938 }
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
939 spriv->framebuf_used -= n;
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
940 }
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
941
18192
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
942 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
943 {
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
944 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
945 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
946
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
947 n = len = 0;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
948 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
949 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
950 {
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
951 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
952 return len;
21531
a90aa203186c Get rid of min/max macros from aviheader.h, they do not belong here.
reimar
parents: 21486
diff changeset
953 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
954 len += m;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
955 frpos += m;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
956 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
957 {
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
958 frpos = 0;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
959 n++;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
960 }
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
961 }
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 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
964 return 0;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
965 return len;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
966 }
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
967
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
968 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
969 {
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
970 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
971 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
972 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
973
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
974 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
975 return 0;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
976
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
977 spts = spriv->pts;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
978 sdts = spriv->dts;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
979 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
980 ret = 0;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
981 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
982 i = 0;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
983 else
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
984 {
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
985 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
986
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
987 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
988 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
989
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
990 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
991
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
992 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
993 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
994 else
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
995 {
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
996 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
997 goto fail;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
998
18192
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
999 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
1000 threshold = 5;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1001 else
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1002 threshold = 10;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1003
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1004 //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
1005 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
1006 i = 1;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1007 else
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 }
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1010 }
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 if(i > -1)
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1013 {
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1014 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
1015 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
1016 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
1017
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1018 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
1019 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
1020 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
1021 ret = 1;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1022
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1023 if(ret)
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 *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
1026 *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
1027 if(*dts == *pts)
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1028 *dts = 0;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1029 }
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1030 }
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 fail:
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1033 spriv->pts = spts;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1034 spriv->dts = sdts;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1035 return ret;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1036 }
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1037
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
1038 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
1039 {
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 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
1041 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
1042 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
1043
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 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
1045 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
1046 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
1047
21141
33cce0f7e66c permit muxing to raw pes (VDR uses this)
nicodvb
parents: 20344
diff changeset
1048 if(priv->rawpes)
33cce0f7e66c permit muxing to raw pes (VDR uses this)
nicodvb
parents: 20344
diff changeset
1049 pack_hlen = 0;
33cce0f7e66c permit muxing to raw pes (VDR uses this)
nicodvb
parents: 20344
diff changeset
1050 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
1051 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
1052 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
1053 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
1054 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
1055 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
1056
19cd9e0f8ac4 prevent buffer overflow in the STD; simplified fill_packet() (moving part of the code to get_packet_stats())
nicodvb
parents: 18558
diff changeset
1057 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
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 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
1060 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
1061
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 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
1063 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
1064 }
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 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
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 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
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 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
1070 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
1071 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
1072 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
1073 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
1074
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 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
1076 target -= hlen;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1077
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
1078 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
1079 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
1080 {
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 //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
1082 //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
1083 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
1084 //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
1085 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
1086 }
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
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 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
1089 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
1090 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
1091 {
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(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
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(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
1095 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
1096 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
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 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
1099 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
1100 }
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
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 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
1103 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
1104 {
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(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
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 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
1108 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
1109 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
1110 }
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 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
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 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
1114 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
1115 }
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 }
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 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1118
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
1119 len += hlen;
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 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
1122 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
1123
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 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
1125 }
18192
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1126
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1127 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
1128 {
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1129 //try to fill a packet as much as possible
25962
afa125da85cf typo fix: inited --> initialized
diego
parents: 25720
diff changeset
1130 //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
1131 //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
1132 //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
1133 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
1134 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
1135 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
1136 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
1137 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
1138 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
1139
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 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
1141
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1142 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
1143 {
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1144 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
1145 return 0;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1146 }
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1147
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1148 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
1149 {
21141
33cce0f7e66c permit muxing to raw pes (VDR uses this)
nicodvb
parents: 20344
diff changeset
1150 if(priv->rawpes)
33cce0f7e66c permit muxing to raw pes (VDR uses this)
nicodvb
parents: 20344
diff changeset
1151 spriv->pack_offset = 0;
33cce0f7e66c permit muxing to raw pes (VDR uses this)
nicodvb
parents: 20344
diff changeset
1152 else
18192
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1153 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
1154 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
1155 {
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1156 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
1157 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
1158 }
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
1159
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
1160 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
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 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
1163 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
1164 }
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
18192
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1166 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
1167 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
1168 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
1169 spriv->frames = 0;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1170 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
1171 }
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1172
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1173 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
1174 {
21413
06d63614eeaa permit to specify the sizes of the decoders' buffers
nicodvb
parents: 21372
diff changeset
1175 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
1176 //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
1177 //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
1178 //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
1179 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
1180 {
06d63614eeaa permit to specify the sizes of the decoders' buffers
nicodvb
parents: 21372
diff changeset
1181 if(s->type == MUXER_TYPE_VIDEO)
06d63614eeaa permit to specify the sizes of the decoders' buffers
nicodvb
parents: 21372
diff changeset
1182 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
1183 else
06d63614eeaa permit to specify the sizes of the decoders' buffers
nicodvb
parents: 21372
diff changeset
1184 bufsize = (conf_abuf_size ? conf_abuf_size : 4);
06d63614eeaa permit to specify the sizes of the decoders' buffers
nicodvb
parents: 21372
diff changeset
1185 spriv->buffer_size = bufsize*1024;
06d63614eeaa permit to specify the sizes of the decoders' buffers
nicodvb
parents: 21372
diff changeset
1186 }
18192
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1187
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1188 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
1189 && 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
1190 dvd_pack = 1;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1191
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
1192 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
1193 {
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1194 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
1195 return 0;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1196 }
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
1197 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
1198 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
1199 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
1200 spriv->last_saved_pts = p.pts;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1201
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1202 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
1203 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
1204
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1205 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
1206 {
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1207 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
1208 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
1209 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
1210 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
1211 else
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 = 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
1213 }
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1214
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1215 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
1216 }
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1217
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 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
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 && priv->scr >= spriv->dts) || priv->scr >= spriv->pts)
32352
76f94c00a69f 1000l, %lf is not valid format string for printf (only for scanf) and actually
reimar
parents: 31864
diff changeset
1222 mp_msg(MSGT_MUXER, MSGL_ERR, "\r\nERROR: scr %.3f, dts %.3f, pts %.3f\r\n", (double) priv->scr/27000000.0, (double) spriv->dts/27000000.0, (double) spriv->pts/27000000.0);
18192
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1223 else if(priv->scr + 63000*300 < spriv->dts)
32352
76f94c00a69f 1000l, %lf is not valid format string for printf (only for scanf) and actually
reimar
parents: 31864
diff changeset
1224 mp_msg(MSGT_MUXER, MSGL_INFO, "\r\nWARNING>: scr %.3f, dts %.3f, pts %.3f, diff %.3f, piff %.3f\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);
18192
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1225 }
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1226
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1227 n = 0;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1228 len = 0;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1229
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1230 frm = spriv->framebuf;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1231 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
1232 {
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1233 if(!frm->pos)
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1234 {
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1235 //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
1236 //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
1237 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
1238 {
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1239 break;
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 spriv->frames++;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1242 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
1243 }
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1244
21531
a90aa203186c Get rid of min/max macros from aviheader.h, they do not belong here.
reimar
parents: 21486
diff changeset
1245 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
1246 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
1247
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1248 len += m;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1249 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
1250 frm->pos += m;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1251
18192
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1252 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
1253 {
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1254 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
1255 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
1256 n++;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1257 frm++;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1258 }
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1259 }
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1260
21141
33cce0f7e66c permit muxing to raw pes (VDR uses this)
nicodvb
parents: 20344
diff changeset
1261 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
1262 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
1263
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1264 spriv->size += len;
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 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
1267 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
1268
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1269 if(n > 0)
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1270 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
1271
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1272 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
1273 if(spriv->track_bufsize > spriv->max_buffer_size)
23637
df9aa9eb9de6 Use proper PRI?64 format strings
reimar
parents: 22929
diff changeset
1274 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
1275
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1276 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
1277 fix_a52_headers(s);
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1278
21141
33cce0f7e66c permit muxing to raw pes (VDR uses this)
nicodvb
parents: 20344
diff changeset
1279 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
1280 {
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1281 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
1282 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
1283 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
1284 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1285
21660
ca9da45d13e9 muxers now write to output muxer->stream rather than to muxer->file
nicodvb
parents: 21544
diff changeset
1286 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
1287
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1288 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
1289 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
1290 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
1291
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1292 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
1293 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
1294 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
1295 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
1296 priv->last_psm_scr = priv->scr;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1297
18192
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1298 return len;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1299 }
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1300
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1301 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
1302 {
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1303 int i, ndts;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1304 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
1305 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
1306 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
1307 pack_stats_t p;
22929
a60dbae6ee1d added :interleaving2, a better method to determine which stream whouls be flushed
nicodvb
parents: 22927
diff changeset
1308 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
1309
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1310 ndts = -1;
22929
a60dbae6ee1d added :interleaving2, a better method to determine which stream whouls be flushed
nicodvb
parents: 22927
diff changeset
1311 perc = -1;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1312
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
1313 //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
1314 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
1315 {
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1316 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
1317
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
1318 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
1319 get_packet_stats(priv, muxer->streams[i], &p, 0);
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1320
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
1321 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
1322 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
1323 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
1324 continue;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1325
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1326 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
1327 {
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1328 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
1329 ndts = i;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1330 }
22929
a60dbae6ee1d added :interleaving2, a better method to determine which stream whouls be flushed
nicodvb
parents: 22927
diff changeset
1331
a60dbae6ee1d added :interleaving2, a better method to determine which stream whouls be flushed
nicodvb
parents: 22927
diff changeset
1332 if(conf_interleaving2)
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 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
1335 if(sperc < perc)
a60dbae6ee1d added :interleaving2, a better method to determine which stream whouls be flushed
nicodvb
parents: 22927
diff changeset
1336 {
a60dbae6ee1d added :interleaving2, a better method to determine which stream whouls be flushed
nicodvb
parents: 22927
diff changeset
1337 ndts = i;
a60dbae6ee1d added :interleaving2, a better method to determine which stream whouls be flushed
nicodvb
parents: 22927
diff changeset
1338 perc = sperc;
a60dbae6ee1d added :interleaving2, a better method to determine which stream whouls be flushed
nicodvb
parents: 22927
diff changeset
1339 }
a60dbae6ee1d added :interleaving2, a better method to determine which stream whouls be flushed
nicodvb
parents: 22927
diff changeset
1340 }
18192
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1341 }
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1342
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1343 return ndts;
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
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
1346 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
1347 {
70c446099f40 new mpeg 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 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
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 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
1351 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
1352 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
1353 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1354
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
1355 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
1356 {
70c446099f40 new mpeg 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 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
1358 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
1359 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
1360 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1361
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
1362 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
1363 buf[7] = (buf[7] & 0x0f) | (priv->vaspect << 4);
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1364
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
1365 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
1366 buf[7] = (buf[7] & 0xf0) | priv->vframerate;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1367
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
1368 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
1369 {
70c446099f40 new mpeg 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 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
1371 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
1372 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
1373 }
70c446099f40 new mpeg 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 }
70c446099f40 new mpeg 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 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
1377 { //patches sequence display extension (display_horizontal_size and display_vertical_size)
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1378 //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
1379 int offset = 1;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1380
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 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
1382 offset += 3;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1383
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
1384 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
1385 {
70c446099f40 new mpeg 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 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
1387 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
1388 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1389
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
1390 offset++;
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 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
1393 {
70c446099f40 new mpeg 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 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
1395 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
1396 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
1397 }
70c446099f40 new mpeg 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 }
70c446099f40 new mpeg 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
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
1401 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
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 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
1404 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
1405 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
1406 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
1407 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
1408
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
1409 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
1410
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 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
1412 {
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
1413 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
1414 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
1415 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
1416 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
1417 }
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1418
32352
76f94c00a69f 1000l, %lf is not valid format string for printf (only for scanf) and actually
reimar
parents: 31864
diff changeset
1419 mp_msg(MSGT_MUXER, MSGL_DBG2, "UPDATE SCR TO %"PRIu64" (%.3f)\n", priv->scr, (double) (priv->scr/27000000.0));
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
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 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
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 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
1424 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
1425
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
1426 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
1427 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
1428 {
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
1429 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
1430 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
1431 }
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
1432 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
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 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
1435 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
1436 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
1437 priv->delta_scr = (uint64_t) (d * 27000000.0f);
23637
df9aa9eb9de6 Use proper PRI?64 format strings
reimar
parents: 22929
diff changeset
1438 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
1439 spriv->track_bufsize = 0;
21448
24775c741a9a cosmetics: anti-chaos reindentation
nicodvb
parents: 21413
diff changeset
1440 }
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
1441
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
1442 if(j > 0)
21448
24775c741a9a cosmetics: anti-chaos reindentation
nicodvb
parents: 21413
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 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
1445 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
1446 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
1447 spriv->buffer_track[j].size = 0;
21448
24775c741a9a cosmetics: anti-chaos reindentation
nicodvb
parents: 21413
diff changeset
1448 }
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
1449
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
1450 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
1451 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
1452 }
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
1453 }
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1454
70c446099f40 new mpeg 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 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
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 int n, found = 0;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1459
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
1460 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
1461 {
70c446099f40 new mpeg 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 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
1463 //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
1464 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
1465 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
1466 {
32352
76f94c00a69f 1000l, %lf is not valid format string for printf (only for scanf) and actually
reimar
parents: 31864
diff changeset
1467 mp_msg(MSGT_MUXER, MSGL_DBG2, "CALC_FRAMES, n=%d, type=%c, pts=%.3f\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
1468 if(n+1 < vpriv->framebuf_used)
32352
76f94c00a69f 1000l, %lf is not valid format string for printf (only for scanf) and actually
reimar
parents: 31864
diff changeset
1469 mp_msg(MSGT_MUXER, MSGL_DBG2, "n+1=%d, type=%c, pts=%.3f\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
1470
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
1471 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
1472 {
70c446099f40 new mpeg 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(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
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 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
1476 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
1477 }
70c446099f40 new mpeg 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 }
70c446099f40 new mpeg 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 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
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 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1483
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
1484 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
1485 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
1486 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
1487 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
1488 }
70c446099f40 new mpeg 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
70c446099f40 new mpeg 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 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
1491 {
18199
10eaea5b657d removed unused variables
nicodvb
parents: 18197
diff changeset
1492 int i, n, found;
10eaea5b657d removed unused variables
nicodvb
parents: 18197
diff changeset
1493 int skip_cnt;
10eaea5b657d removed unused variables
nicodvb
parents: 18197
diff changeset
1494 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
1495 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
1496 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
1497 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
1498 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
1499 uint64_t iduration, iaduration;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1500
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1501 /*
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
1502 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
1503 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
1504 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
1505 */
70c446099f40 new mpeg 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 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
1507 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
1508 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
1509 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
1510 {
70c446099f40 new mpeg 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 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
1512 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
1513 {
70c446099f40 new mpeg 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 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
1515 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
1516 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
1517 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
1518 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
1519 }
70c446099f40 new mpeg 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 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
1521 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
1522 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1523
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
1524 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
1525 {
70c446099f40 new mpeg 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(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
1527 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
1528 }
70c446099f40 new mpeg 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
70c446099f40 new mpeg 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 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
1531 {
15278
a45c7e1b998f added support for AAC; moved most of MSGL_V to MSGL_DBG2 to reduce verbosity
nicodvb
parents: 15083
diff changeset
1532 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
1533
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1534 vpriv = (muxer_headers_t*) vs->priv;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1535
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
1536 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
1537 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
1538 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
1539 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
1540 duration = (double) (iduration / 27000000.0);
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1541
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
1542 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
1543 {
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 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
1545 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
1546 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
1547 {
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 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
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 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
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 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
1553 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
1554 }
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 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1556
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
1557 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
1558 {
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
1559 init_delay = vpriv->framebuf[0].pts - vpriv->framebuf[0].dts;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
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 for(i = 0; i < apriv->framebuf_cnt; i++)
21448
24775c741a9a cosmetics: anti-chaos reindentation
nicodvb
parents: 21413
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 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
1564 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
1565 }
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->last_pts += init_delay;
32352
76f94c00a69f 1000l, %lf is not valid format string for printf (only for scanf) and actually
reimar
parents: 31864
diff changeset
1567 mp_msg(MSGT_MUXER, MSGL_DBG2, "\r\nINITIAL VIDEO DELAY: %.3f, currAPTS: %.3f\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
1568 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1569
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 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
1571 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
1572
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
1573 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
1574 skip_cnt = 0;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1575
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 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
1577 {
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 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
1579 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
1580 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
1581 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
1582 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
1583 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
1584
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
1585 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
1586 {
5ccb2b837b1c if no stream could be muxed flush_buffers() returns 0: prevents while(1) stall at the end
nicodvb
parents: 20153
diff changeset
1587 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
1588 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
1589 }
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
1590 }
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
1591 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1592
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
1593 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
1594 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
1595 }
70c446099f40 new mpeg 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
70c446099f40 new mpeg 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
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
1598 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
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 // 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
1601 int d = (int)(fps*1001+0.5);
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1602
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
1603 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
1604 }
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1605
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
1606
21467
dd765bcd83aa added generalized teleciner by Donald Graft
nicodvb
parents: 21448
diff changeset
1607 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
1608 {
17814
8f2e94a4a4c1 check pce_ptr before using it; fixes cid 207
nicodvb
parents: 17603
diff changeset
1609 if(! pce_ptr)
8f2e94a4a4c1 check pce_ptr before using it; fixes cid 207
nicodvb
parents: 17603
diff changeset
1610 return 0;
14840
d49482c5d8ac soft telecine support! :)) patch by nico
rfelker
parents: 14809
diff changeset
1611 if(fps_ptr != NULL)
d49482c5d8ac soft telecine support! :)) patch by nico
rfelker
parents: 14809
diff changeset
1612 {
21484
af37e86b635f cosmetics
nicodvb
parents: 21483
diff changeset
1613 *fps_ptr = (*fps_ptr & 0xf0) | priv->vframerate;
af37e86b635f cosmetics
nicodvb
parents: 21483
diff changeset
1614 vpriv->nom_delta_pts = parse_fps(conf_vframerate);
14840
d49482c5d8ac soft telecine support! :)) patch by nico
rfelker
parents: 14809
diff changeset
1615 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1616
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1617 //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
1618 if(pce_ptr[3] & 0x2)
d49482c5d8ac soft telecine support! :)) patch by nico
rfelker
parents: 14809
diff changeset
1619 {
d49482c5d8ac soft telecine support! :)) patch by nico
rfelker
parents: 14809
diff changeset
1620 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
1621 vpriv->telecine = 0;
d49482c5d8ac soft telecine support! :)) patch by nico
rfelker
parents: 14809
diff changeset
1622 return 0;
d49482c5d8ac soft telecine support! :)) patch by nico
rfelker
parents: 14809
diff changeset
1623 }
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
1624
14894
bd6d709d13fb recalculate frame duration after soft telecine
nicodvb
parents: 14881
diff changeset
1625 vpriv->picture.progressive_sequence = 0;
bd6d709d13fb recalculate frame duration after soft telecine
nicodvb
parents: 14881
diff changeset
1626 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
1627 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
1628 se_ptr[1] &= 0xf7;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1629
24630
dcba95743b2f 1000l, the tff flag was never cleared before being overwritten with the value on bff_mask;
nicodvb
parents: 23637
diff changeset
1630 //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
1631 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
1632 pce_ptr[4] |= 0x80; //sets progressive frame
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1633
21467
dd765bcd83aa added generalized teleciner by Donald Graft
nicodvb
parents: 21448
diff changeset
1634 vpriv->display_frame += n;
14840
d49482c5d8ac soft telecine support! :)) patch by nico
rfelker
parents: 14809
diff changeset
1635 if(! vpriv->vframes)
21483
e065bb0c5485 removed dead code
nicodvb
parents: 21482
diff changeset
1636 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
1637
14840
d49482c5d8ac soft telecine support! :)) patch by nico
rfelker
parents: 14809
diff changeset
1638 return 1;
d49482c5d8ac soft telecine support! :)) patch by nico
rfelker
parents: 14809
diff changeset
1639 }
d49482c5d8ac soft telecine support! :)) patch by nico
rfelker
parents: 14809
diff changeset
1640
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
1641 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
1642 {
14840
d49482c5d8ac soft telecine support! :)) patch by nico
rfelker
parents: 14809
diff changeset
1643 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
1644 uint8_t *se_ptr = NULL; //pointer to sequence extension
d49482c5d8ac soft telecine support! :)) patch by nico
rfelker
parents: 14809
diff changeset
1645 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
1646 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
1647 int ret;
22330
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1648 int i, err;
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1649 uint32_t temp_ref;
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1650 int pt;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1651
15278
a45c7e1b998f added support for AAC; moved most of MSGL_V to MSGL_DBG2 to reduce verbosity
nicodvb
parents: 15083
diff changeset
1652 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
1653 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
1654 {
31798
2d9044967a46 Add 'z' length modifier to %d printf format specifiers for size_t arguments.
diego
parents: 31623
diff changeset
1655 mp_msg(MSGT_MUXER, MSGL_ERR,"Unknown video format, possibly non-MPEG1/2 stream, len=%zd!\n", 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
1656 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
1657 }
22330
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1658
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1659 temp_ref = 0;
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1660 pt = 0;
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1661 err = 0;
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1662 i = 0;
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1663 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
1664 { // Video (0) Sequence header (b3) or GOP (b8)
22330
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1665 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
1666 {
22330
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1667 switch(s->buffer[i+3])
14840
d49482c5d8ac soft telecine support! :)) patch by nico
rfelker
parents: 14809
diff changeset
1668 {
22330
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1669 case 0xb3: //sequence
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1670 {
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1671 if(i + 11 > len)
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1672 {
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1673 err=1;
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1674 break;
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1675 }
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1676 fps_ptr = &(s->buffer[i+7]);
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1677 mp_header_process_sequence_header(&(spriv->picture), &(s->buffer[i+4]));
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1678 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
1679
22330
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1680 spriv->delta_clock = (double) 1/fps;
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1681 //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
1682 if(! spriv->delta_pts)
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1683 spriv->delta_pts = spriv->nom_delta_pts = (uint64_t) ((double)27000000.0 * spriv->delta_clock );
32352
76f94c00a69f 1000l, %lf is not valid format string for printf (only for scanf) and actually
reimar
parents: 31864
diff changeset
1684 mp_msg(MSGT_MUXER, MSGL_DBG2, "\nFPS: %.3f, FRAMETIME: %.3f\n", fps, (double)1/fps);
22330
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1685 if(priv->patch_seq)
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1686 patch_seq(priv, &(s->buffer[i]));
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1687 }
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1688 break;
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1689
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1690 case 0xb5:
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1691 if(i + 9 > len)
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1692 {
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1693 err = 1;
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1694 break;
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1695 }
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1696 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
1697 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
1698 se_ptr = &(s->buffer[i+4]);
22330
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1699 if(((s->buffer[i+4] & 0xf0) == 0x20))
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1700 {
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1701 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
1702 patch_panscan(priv, &(s->buffer[i+4]));
22330
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1703 }
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1704 if((s->buffer[i+4] & 0xf0) == 0x80)
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1705 {
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1706 pce_ptr = &(s->buffer[i+4]);
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1707 }
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1708 break;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1709
22330
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1710 case 0xb8:
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1711 gop_reset = 1;
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1712 break;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1713
22330
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1714 case 0x00:
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1715 if(i + 5 > len)
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1716 {
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1717 err = 1;
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1718 break;
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1719 }
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1720 pt = (s->buffer[i+5] & 0x1c) >> 3;
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1721 temp_ref = (s->buffer[i+4]<<2)+(s->buffer[i+5]>>6);
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1722 break;
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1723 }
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1724 if(err) break; //something went wrong
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1725 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
1726 }
22330
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1727 i++;
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1728 }
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1729 if(err)
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1730 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
1731
22332
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1732 //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
1733 if(!spriv->nom_delta_pts)
22332
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1734 spriv->delta_pts = spriv->nom_delta_pts = parse_fps(fps);
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1735 if(!spriv->vframes)
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1736 spriv->last_tr = spriv->max_tr = temp_ref;
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1737 d1 = temp_ref - spriv->last_tr;
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1738 if(gop_reset)
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1739 frames_diff = spriv->max_tr + 1 + temp_ref - spriv->last_tr;
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1740 else
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1741 {
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1742 if(d1 < -6) //there's a wraparound
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1743 frames_diff = spriv->max_tr + 1 + temp_ref - spriv->last_tr;
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1744 else if(d1 > 6) //there's a wraparound
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1745 frames_diff = spriv->max_tr + 1 + spriv->last_tr - temp_ref;
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1746 else if(!d1) //pre-emptive fix against broken sequences
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1747 frames_diff = 1;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1748 else
22332
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1749 frames_diff = d1;
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1750 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1751 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
1752 spriv->last_tr, temp_ref, gop_reset, frames_diff, spriv->max_tr, d1);
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1753
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1754 if(temp_ref > spriv->max_tr || gop_reset)
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1755 spriv->max_tr = temp_ref;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1756
22332
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1757 spriv->last_tr = temp_ref;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1758 if(spriv->picture.mpeg1 == 0)
22332
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1759 {
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1760 if(spriv->telecine && pce_ptr)
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1761 {
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1762 soft_telecine(priv, spriv, fps_ptr, se_ptr, pce_ptr, frames_diff);
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1763 spriv->picture.display_time = 100;
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1764 mp_header_process_extension(&(spriv->picture), pce_ptr);
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1765 if(spriv->picture.display_time >= 50 && spriv->picture.display_time <= 300)
22332
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1766 spriv->delta_pts = (spriv->nom_delta_pts * spriv->picture.display_time) / 100;
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1767 }
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1768 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1769
22332
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1770 if(! spriv->vframes)
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1771 frames_diff = 1;
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1772
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1773 spriv->last_dts += spriv->delta_pts;
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1774 spriv->last_pts += spriv->nom_delta_pts*(frames_diff-1) + spriv->delta_pts;
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1775
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1776 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
1777 if(ret < 0)
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1778 {
31798
2d9044967a46 Add 'z' length modifier to %d printf format specifiers for size_t arguments.
diego
parents: 31623
diff changeset
1779 mp_msg(MSGT_MUXER, MSGL_FATAL, "\r\nPARSE_MPEG12: add_frames(%zd) failed, exit\r\n", len);
22332
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1780 return 0;
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1781 }
32352
76f94c00a69f 1000l, %lf is not valid format string for printf (only for scanf) and actually
reimar
parents: 31864
diff changeset
1782 mp_msg(MSGT_MUXER, MSGL_DBG2, "\r\nVIDEO FRAME, PT: %C, tr: %d, diff: %d, dts: %.3f, pts: %.3f, pdt: %u, gop_reset: %d\r\n",
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1783 ftypes[pt], temp_ref, frames_diff, ((double) spriv->last_dts/27000000.0f),
22332
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1784 ((double) spriv->last_pts/27000000.0f), spriv->picture.display_time, gop_reset);
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1785
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1786 if(pt == B_FRAME)
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1787 {
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1788 int j, n, adj = 0;
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1789 int64_t diff = spriv->last_dts - spriv->last_pts;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1790
22332
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1791 if(diff != 0)
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1792 {
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1793 n = spriv->framebuf_used - 1;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1794
22332
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1795 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
1796 {
22332
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1797 if(spriv->framebuf[j].pts >= spriv->last_pts)
14894
bd6d709d13fb recalculate frame duration after soft telecine
nicodvb
parents: 14881
diff changeset
1798 {
22332
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1799 spriv->framebuf[j].pts += diff;
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1800 adj++;
14894
bd6d709d13fb recalculate frame duration after soft telecine
nicodvb
parents: 14881
diff changeset
1801 }
bd6d709d13fb recalculate frame duration after soft telecine
nicodvb
parents: 14881
diff changeset
1802 }
32352
76f94c00a69f 1000l, %lf is not valid format string for printf (only for scanf) and actually
reimar
parents: 31864
diff changeset
1803 mp_msg(MSGT_MUXER, MSGL_V, "\r\nResynced B-frame by %d units, DIFF: %"PRId64" (%.3f),[pd]ts=%.3f\r\n",
22332
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1804 n, diff, (double) diff/27000000.0f, (double) spriv->last_pts/27000000.0f);
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1805 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
1806 }
22332
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1807 }
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1808 spriv->vframes++;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1809
15278
a45c7e1b998f added support for AAC; moved most of MSGL_V to MSGL_DBG2 to reduce verbosity
nicodvb
parents: 15083
diff changeset
1810 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
1811 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
1812 }
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1813
70c446099f40 new mpeg 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 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
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 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
1818 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
1819
70c446099f40 new mpeg 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 mn = mx = vpriv->framebuf[0].pts;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1821 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
1822 {
16750
0a31740dd5e6 Use PRI?64 defines as format strings for 64 bit variables.
reimar
parents: 16192
diff changeset
1823 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
1824 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
1825 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
1826 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
1827 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
1828 }
70c446099f40 new mpeg 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 md = mn;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1830 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
1831 {
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1832 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
1833 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
1834 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1835
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
1836 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
1837 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
1838 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
1839 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
1840
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
1841 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
1842 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
1843 {
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1844 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
1845 {
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1846 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
1847 vpriv->framebuf[i].dts += i * diff;
32352
76f94c00a69f 1000l, %lf is not valid format string for printf (only for scanf) and actually
reimar
parents: 31864
diff changeset
1848 mp_msg(MSGT_MUXER, MSGL_DBG2, "FIXED_PTS: %.3f, FIXED_DTS: %.3f\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
1849 (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
1850 }
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1851 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
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 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
1854 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
1855 }
70c446099f40 new mpeg 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
70c446099f40 new mpeg 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 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
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 size_t ptr = 0;
17815
36a155ee4d27 init delta_pts before using it; fixes cid 239
nicodvb
parents: 17814
diff changeset
1861 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
1862 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
1863 int ret;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1864
15278
a45c7e1b998f added support for AAC; moved most of MSGL_V to MSGL_DBG2 to reduce verbosity
nicodvb
parents: 15083
diff changeset
1865 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
1866 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
1867 {
31798
2d9044967a46 Add 'z' length modifier to %d printf format specifiers for size_t arguments.
diego
parents: 31623
diff changeset
1868 mp_msg(MSGT_MUXER, MSGL_ERR,"Frame too short: %zd, exit!\n", 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
1869 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
1870 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1871
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
1872 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
1873 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
1874 {
70c446099f40 new mpeg 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 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
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 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
1878 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
1879 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1880
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
1881 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
1882 {
70c446099f40 new mpeg 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 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
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 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
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 //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
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 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
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 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
1892 mp4_header_process_vop(&(vpriv->picture), &(s->buffer[ptr+4]));
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1893
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
1894 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
1895 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
1896 delta -= vpriv->picture.timeinc_resolution;
18163
1e4caa08161d fixed wrong operator precedence in parse_mpeg4_video()
nicodvb
parents: 18162
diff changeset
1897 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
1898 delta += vpriv->picture.timeinc_resolution;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1899
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
1900 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
1901 //warning, it seems that packed bops can lead to delta == 0
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1902
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
1903 pt = vpriv->picture.picture_type + 1;
32352
76f94c00a69f 1000l, %lf is not valid format string for printf (only for scanf) and actually
reimar
parents: 31864
diff changeset
1904 mp_msg(MSGT_MUXER, MSGL_DBG2, "\nTYPE: %c, RESOLUTION: %d, TEMP: %d, delta: %d, delta_pts: %"PRId64" = %.3f, delta2: %.3f\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
1905 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
1906 (double) delta / (double) vpriv->picture.timeinc_resolution);
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1907
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1908 vpriv->last_tr = vpriv->picture.timeinc_unit;
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1909
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
1910 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
1911 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1912
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
1913 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
1914 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1915
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
1916 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
1917 {
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 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
1919 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
1920 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1921
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
1922 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
1923 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
1924 {
31798
2d9044967a46 Add 'z' length modifier to %d printf format specifiers for size_t arguments.
diego
parents: 31623
diff changeset
1925 mp_msg(MSGT_MUXER, MSGL_FATAL, "\r\nPARSE_MPEG4: add_frames(%zd) 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
1926 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
1927 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1928
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
1929 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
1930 {
70c446099f40 new mpeg 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 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
1932 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
1933 {
70c446099f40 new mpeg 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 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
1935 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
1936 vpriv->delta_clock = ((double) vpriv->frame_duration)/27000000.0;
32352
76f94c00a69f 1000l, %lf is not valid format string for printf (only for scanf) and actually
reimar
parents: 31864
diff changeset
1937 mp_msg(MSGT_MUXER, MSGL_INFO, "FRAME DURATION: %"PRIu64" %.3f\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
1938 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
1939 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
1940 }
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1941 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1942
32352
76f94c00a69f 1000l, %lf is not valid format string for printf (only for scanf) and actually
reimar
parents: 31864
diff changeset
1943 mp_msg(MSGT_MUXER, MSGL_DBG2, "LAST_PTS: %.3f, LAST_DTS: %.3f\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
1944 (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
1945
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
1946 vpriv->vframes++;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1947
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
1948 return len;
8585
27da710563c2 the long-waited MUXER layer, and new MPEG-PS muxer
arpi
parents:
diff changeset
1949 }
27da710563c2 the long-waited MUXER layer, and new MPEG-PS muxer
arpi
parents:
diff changeset
1950
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
1951
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
1952 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
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 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
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 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
1957 return 0;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1958
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
1959 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
1960 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
1961 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
1962 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
1963
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 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
1965 {
18558
4928dd61f136 Fix potential integer overflows in memory allocation.
rtogni
parents: 18249
diff changeset
1966 if(spriv->framebuf[idx].size > SIZE_MAX - (size_t)len)
4928dd61f136 Fix potential integer overflows in memory allocation.
rtogni
parents: 18249
diff changeset
1967 return 0;
30702
9fc9d1e788aa Do not cast the results of malloc/calloc/realloc.
diego
parents: 30633
diff changeset
1968 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
1969 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
1970 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
1971 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
1972 }
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
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 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
1975 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
1976
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 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
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
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
1980 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
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 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
1983
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
1984 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
1985 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
1986 {
30702
9fc9d1e788aa Do not cast the results of malloc/calloc/realloc.
diego
parents: 30633
diff changeset
1987 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
1988 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
1989 {
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 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
1991 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
1992 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1993
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 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
1995 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
1996 spriv->framebuf[spriv->framebuf_cnt].pos = 0;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1997
30702
9fc9d1e788aa Do not cast the results of malloc/calloc/realloc.
diego
parents: 30633
diff changeset
1998 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
1999 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
2000 {
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 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
2002 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
2003 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
2004 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
2005 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
2006 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
2007
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
2008 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
2009 {
18558
4928dd61f136 Fix potential integer overflows in memory allocation.
rtogni
parents: 18249
diff changeset
2010 if(spriv->framebuf[idx].size > SIZE_MAX - (size_t)len)
4928dd61f136 Fix potential integer overflows in memory allocation.
rtogni
parents: 18249
diff changeset
2011 {
4928dd61f136 Fix potential integer overflows in memory allocation.
rtogni
parents: 18249
diff changeset
2012 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
2013 return -1;
4928dd61f136 Fix potential integer overflows in memory allocation.
rtogni
parents: 18249
diff changeset
2014 }
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
2015 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
2016 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
2017 {
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 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
2019 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
2020 }
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
2021 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
2022 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
2023
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
2024 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
2025 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
2026 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
2027 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
2028
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
2029 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
2030 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
2031 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
2032 spriv->framebuf_used++;
23637
df9aa9eb9de6 Use proper PRI?64 format strings
reimar
parents: 22929
diff changeset
2033 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
2034
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
2035 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
2036 }
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
2037
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
2038 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
2039 {
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 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
2041 int score[4] = {0, 0, 0, 0};
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
2042
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
2043 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
2044 {
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 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
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 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
2048 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
2049 {
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 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
2051 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
2052 }
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 }
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 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
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
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 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
2058 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
2059 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
2060 {
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 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
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 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
2064 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
2065 }
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 }
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 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
2069 }
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
2070
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
2071 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
2072 {
31799
fe2e3c755706 Use mp_a52_framesize() in all cases; gets rid of liba52 dependency.
diego
parents: 31798
diff changeset
2073 int i, j, len, chans, srate, spf, layer, tot, num, frm_idx;
18238
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2074 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
2075 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
2076 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
2077 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
2078 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
2079
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 i = tot = frames = 0;
18238
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2081 finished = 0;
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2082 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
2083 {
18238
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2084 len = 0;
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2085 switch(s->wf->wFormatTag)
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2086 {
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
2087 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
2088 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
2089 {
18238
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2090 if(i + 3 >= s->b_buffer_len)
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2091 {
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2092 finished = 1;
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2093 break;
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2094 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
2095
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
2096 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
2097 {
16162
b5c2254d13f8 set i_bps in demux_audio for WAV and MP3 to avoid division by zero before
reimar
parents: 15947
diff changeset
2098 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
2099 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
2100 && 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
2101 {
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
2102 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
2103 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
2104 }
18238
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2105 else
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2106 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
2107 }
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
2108 }
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 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
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 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
2112 {
18238
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2113 if(i + 6 >= s->b_buffer_len)
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2114 {
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2115 finished = 1;
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2116 break;
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2117 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
2118
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
2119 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
2120 {
17493
f71e678e6216 use mp_a52_framesize() when liba52 is not available
nicodvb
parents: 17487
diff changeset
2121 srate = 0;
f71e678e6216 use mp_a52_framesize() when liba52 is not available
nicodvb
parents: 17487
diff changeset
2122 len = mp_a52_framesize(&(s->b_buffer[i]), &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
2123 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
2124 {
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
2125 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
2126 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
2127 }
18238
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2128 else
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2129 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
2130 }
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
2131 }
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
2132 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
2133
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
2134 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
2135 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
2136 {
18238
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2137 if(i + 7 >= s->b_buffer_len)
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2138 {
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2139 finished = 1;
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2140 break;
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2141 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
2142
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
2143 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
2144 {
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
2145 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
2146 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
2147 {
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
2148 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
2149 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
2150 }
18238
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2151 else
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2152 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
2153 }
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
2154 }
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
2155 }
18238
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2156
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2157 if(finished)
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2158 break;
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2159
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2160 if(!len)
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2161 {
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2162 i++;
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2163 continue;
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2164 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
2165
18238
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2166 spriv->timer += dur;
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2167 if(spriv->drop_delayed_frames && delay < 0 && spriv->timer <= -delay)
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2168 {
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2169 i += len;
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2170 tot = i;
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2171 continue;
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2172 }
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2173
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2174 frames++;
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2175 fill_last_frame(spriv, &(s->b_buffer[tot]), i - tot);
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2176 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
2177 if(frm_idx < 0)
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2178 {
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2179 mp_msg(MSGT_MUXER, MSGL_FATAL, "Couldn't add audio frame buffer(frame), abort\n");
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2180 goto audio_exit;
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2181 }
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2182 for(j = frm_idx; j < spriv->framebuf_cnt; j++)
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2183 spriv->framebuf[j].pts = spriv->last_pts;
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2184 spriv->last_pts += idur;
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2185
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2186 i += len;
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2187 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
2188 }
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
2189
18238
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2190 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
2191 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
2192 {
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
2193 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
2194 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
2195 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
2196 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
2197 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
2198 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
2199 }
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
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 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
2202 {
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
2203 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
2204 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
2205 {
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
2206 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
2207 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
2208 }
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
2209 }
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
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
2211 *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
2212 *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
2213
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
2214 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
2215 }
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
2216
18183
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
2217 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
2218 {
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
2219 muxer_headers_t *spriv = stream->priv;
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
2220 muxer_t *muxer = stream->muxer;
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
2221 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
2222 uint32_t stream_format;
24909
55c96e871198 10l, priv->use_psm can be 1 only if the format is genmpeg2
nicodvb
parents: 24908
diff changeset
2223 int needs_psm = 0;
18183
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 if(stream->type == MUXER_TYPE_AUDIO)
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
2226 {
24905
170dcb44069a moved to fix_parameters() the code that decides if the PSM is needed
nicodvb
parents: 24904
diff changeset
2227 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
2228 spriv->is_ready = 1;
21413
06d63614eeaa permit to specify the sizes of the decoders' buffers
nicodvb
parents: 21372
diff changeset
2229 if(conf_abuf_size)
06d63614eeaa permit to specify the sizes of the decoders' buffers
nicodvb
parents: 21372
diff changeset
2230 spriv->max_buffer_size = conf_abuf_size*1024;
06d63614eeaa permit to specify the sizes of the decoders' buffers
nicodvb
parents: 21372
diff changeset
2231 else
18183
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
2232 spriv->max_buffer_size = 4*1024;
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
2233 if(stream->wf->wFormatTag == AUDIO_A52)
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
2234 {
31623
4d4ed6c9039c Fix some remaining bswap-related compilation issues.
reimar
parents: 31618
diff changeset
2235 stream->ckid = av_be2ne32(0x1bd);
18183
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
2236 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
2237 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
2238 spriv->id = 0xbd;
21413
06d63614eeaa permit to specify the sizes of the decoders' buffers
nicodvb
parents: 21372
diff changeset
2239 if(!conf_abuf_size)
18183
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
2240 spriv->max_buffer_size = 16*1024;
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
2241 }
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
2242 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
2243 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
2244 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
2245 spriv->is_ready = 0;
18183
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
2246 }
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
2247 else //video
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
2248 {
24905
170dcb44069a moved to fix_parameters() the code that decides if the PSM is needed
nicodvb
parents: 24904
diff changeset
2249 stream_format = stream->bih->biCompression;
21413
06d63614eeaa permit to specify the sizes of the decoders' buffers
nicodvb
parents: 21372
diff changeset
2250 if(conf_vbuf_size)
06d63614eeaa permit to specify the sizes of the decoders' buffers
nicodvb
parents: 21372
diff changeset
2251 spriv->max_buffer_size = conf_vbuf_size*1024;
06d63614eeaa permit to specify the sizes of the decoders' buffers
nicodvb
parents: 21372
diff changeset
2252 else
06d63614eeaa permit to specify the sizes of the decoders' buffers
nicodvb
parents: 21372
diff changeset
2253 {
24902
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2254 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
2255 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
2256 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
2257 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
2258 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
2259 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
2260 else
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; //no profile => unconstrained :) FIXME!!!
21413
06d63614eeaa permit to specify the sizes of the decoders' buffers
nicodvb
parents: 21372
diff changeset
2262 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
2263
18183
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
2264 if(is_mpeg4(stream->bih->biCompression))
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
2265 spriv->is_ready = 0;
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
2266 else
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
2267 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
2268
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
2269 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
2270 needs_psm = 1;
18183
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
2271 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
2272
24909
55c96e871198 10l, priv->use_psm can be 1 only if the format is genmpeg2
nicodvb
parents: 24908
diff changeset
2273 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
2274 {
24909
55c96e871198 10l, priv->use_psm can be 1 only if the format is genmpeg2
nicodvb
parents: 24908
diff changeset
2275 priv->use_psm = 1;
24905
170dcb44069a moved to fix_parameters() the code that decides if the PSM is needed
nicodvb
parents: 24904
diff changeset
2276 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
2277 priv->psm_streams_cnt++;
170dcb44069a moved to fix_parameters() the code that decides if the PSM is needed
nicodvb
parents: 24904
diff changeset
2278 }
18183
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
2279 }
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
2280
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
2281
24902
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2282 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
2283 {
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2284 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
2285 uint64_t tmp;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2286 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
2287 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
2288 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
2289 float fps;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2290 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
2291
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2292 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
2293 return;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2294
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2295 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
2296 { // 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
2297 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
2298 spriv->type = 1;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2299 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
2300 if(! spriv->vframes)
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2301 {
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2302 spriv->last_dts = spriv->last_pts - (uint64_t)(27000000.0f/fps);
32352
76f94c00a69f 1000l, %lf is not valid format string for printf (only for scanf) and actually
reimar
parents: 31864
diff changeset
2303 mp_msg(MSGT_MUXER, MSGL_INFO,"INITV: %.3f, %.3f, fps: %.3f\r\n", (double) spriv->last_pts/27000000.0f, (double) spriv->last_dts/27000000.0f, fps);
24902
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2304 }
21448
24775c741a9a cosmetics: anti-chaos reindentation
nicodvb
parents: 21413
diff changeset
2305
24902
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2306 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
2307 {
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2308 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
2309 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
2310 if(len)
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2311 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
2312 else
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 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
2315 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
2316 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
2317 }
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2318 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
2319 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
2320 {
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2321 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
2322 spriv->telecine = 0;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2323 if(len)
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2324 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
2325 else
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 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
2328 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
2329 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
2330 }
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2331 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
2332
24902
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2333 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
2334 }
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2335 else
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2336 { // MUXER_TYPE_AUDIO
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2337 double fake_timer;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2338 spriv->type = 0;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2339 stream_format = s->wf->wFormatTag;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
2340
24902
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2341 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
2342 {
24910
74ae00838094 prevent unlikely memleak
nicodvb
parents: 24909
diff changeset
2343 void *tmp;
74ae00838094 prevent unlikely memleak
nicodvb
parents: 24909
diff changeset
2344
24902
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2345 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
2346 {
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2347 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
2348 return;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2349 }
24910
74ae00838094 prevent unlikely memleak
nicodvb
parents: 24909
diff changeset
2350 tmp = realloc(s->b_buffer, len + s->b_buffer_len);
74ae00838094 prevent unlikely memleak
nicodvb
parents: 24909
diff changeset
2351 if(!tmp)
24902
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2352 {
31798
2d9044967a46 Add 'z' length modifier to %d printf format specifiers for size_t arguments.
diego
parents: 31623
diff changeset
2353 mp_msg(MSGT_MUXER, MSGL_FATAL, "\nFATAL! couldn't realloc %zd bytes\n", len + s->b_buffer_len);
24902
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 s->b_buffer = tmp;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
2357
24902
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2358 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
2359 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
2360 }
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2361 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
2362 s->b_buffer_len += len;
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 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
2365 {
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2366 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
2367 {
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2368 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
2369 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
2370 }
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 else
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 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
2375 spriv->vframes += nf;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2376 if(! spriv->vframes)
32352
76f94c00a69f 1000l, %lf is not valid format string for printf (only for scanf) and actually
reimar
parents: 31864
diff changeset
2377 mp_msg(MSGT_MUXER, MSGL_INFO, "AINIT: %.3f\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
2378 }
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
2379 }
8585
27da710563c2 the long-waited MUXER layer, and new MPEG-PS muxer
arpi
parents:
diff changeset
2380
24902
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2381 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
2382 }
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
2383
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
2384
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
2385 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
2386 {
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
2387 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
2388 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
2389 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
2390
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
2391 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
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 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
2394 {
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
2395 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
2396 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
2397 }
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
2398 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
2399 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
2400 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
2401 {
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
2402 priv->scr = 0;
21660
ca9da45d13e9 muxers now write to output muxer->stream rather than to muxer->file
nicodvb
parents: 21544
diff changeset
2403 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
2404 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
2405
32352
76f94c00a69f 1000l, %lf is not valid format string for printf (only for scanf) and actually
reimar
parents: 31864
diff changeset
2406 mp_msg(MSGT_MUXER, MSGL_INFO, "\nOverhead: %.3f%% (%"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
2407 }
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
2408
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
2409 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
2410 {
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
2411 muxer_priv_t *priv = (muxer_priv_t*) muxer->priv;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
2412
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
2413 mp_msg(MSGT_MUXER, MSGL_INFO, MSGTR_WritingHeader);
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
2414
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
2415 priv->headers_cnt++;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
2416
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
2417 //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
2418 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
2419 {
21660
ca9da45d13e9 muxers now write to output muxer->stream rather than to muxer->file
nicodvb
parents: 21544
diff changeset
2420 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
2421 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
2422 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
2423
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
2424 return;
8585
27da710563c2 the long-waited MUXER layer, and new MPEG-PS muxer
arpi
parents:
diff changeset
2425 }
27da710563c2 the long-waited MUXER layer, and new MPEG-PS muxer
arpi
parents:
diff changeset
2426
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 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
2428 {
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
2429 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
2430 {
21413
06d63614eeaa permit to specify the sizes of the decoders' buffers
nicodvb
parents: 21372
diff changeset
2431 int v = (conf_vbuf_size ? conf_vbuf_size : 232);
06d63614eeaa permit to specify the sizes of the decoders' buffers
nicodvb
parents: 21372
diff changeset
2432 int a1 = (conf_abuf_size ? conf_abuf_size : 4);
06d63614eeaa permit to specify the sizes of the decoders' buffers
nicodvb
parents: 21372
diff changeset
2433 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
2434
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
2435 priv->sys_info.cnt = 4;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
2436
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
2437 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
2438 priv->sys_info.streams[0].type = 1;
21413
06d63614eeaa permit to specify the sizes of the decoders' buffers
nicodvb
parents: 21372
diff changeset
2439 priv->sys_info.streams[0].bufsize = v*1024;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
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.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
2442 priv->sys_info.streams[1].type = 0;
21413
06d63614eeaa permit to specify the sizes of the decoders' buffers
nicodvb
parents: 21372
diff changeset
2443 priv->sys_info.streams[1].bufsize = a1*1024;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
2444
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
2445 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
2446 priv->sys_info.streams[2].type = 1;
21413
06d63614eeaa permit to specify the sizes of the decoders' buffers
nicodvb
parents: 21372
diff changeset
2447 priv->sys_info.streams[2].bufsize = a2*1024;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
2448
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
2449 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
2450 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
2451 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
2452 }
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
2453 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
2454 {
21413
06d63614eeaa permit to specify the sizes of the decoders' buffers
nicodvb
parents: 21372
diff changeset
2455 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
2456 int a1 = (conf_abuf_size ? conf_abuf_size : 4);
06d63614eeaa permit to specify the sizes of the decoders' buffers
nicodvb
parents: 21372
diff changeset
2457
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
2458 priv->sys_info.cnt = 2;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
2459
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
2460 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
2461 priv->sys_info.streams[0].type = 1;
21413
06d63614eeaa permit to specify the sizes of the decoders' buffers
nicodvb
parents: 21372
diff changeset
2462 priv->sys_info.streams[0].bufsize = v*1024;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
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.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
2465 priv->sys_info.streams[1].type = 0;
21413
06d63614eeaa permit to specify the sizes of the decoders' buffers
nicodvb
parents: 21372
diff changeset
2466 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
2467 }
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
2468 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
2469 priv->sys_info.cnt = 0;
8585
27da710563c2 the long-waited MUXER layer, and new MPEG-PS muxer
arpi
parents:
diff changeset
2470 }
27da710563c2 the long-waited MUXER layer, and new MPEG-PS muxer
arpi
parents:
diff changeset
2471
21467
dd765bcd83aa added generalized teleciner by Donald Graft
nicodvb
parents: 21448
diff changeset
2472 /* 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
2473 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
2474 {
dd765bcd83aa added generalized teleciner by Donald Graft
nicodvb
parents: 21448
diff changeset
2475 unsigned int i, trfp;
dd765bcd83aa added generalized teleciner by Donald Graft
nicodvb
parents: 21448
diff changeset
2476 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
2477 unsigned char ormask[4] = {0x0, 0x2, 0x80, 0x82};
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
2478
21467
dd765bcd83aa added generalized teleciner by Donald Graft
nicodvb
parents: 21448
diff changeset
2479 dfl = (target - source) << 1;
dd765bcd83aa added generalized teleciner by Donald Graft
nicodvb
parents: 21448
diff changeset
2480 tfl = source >> 1;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
2481
21467
dd765bcd83aa added generalized teleciner by Donald Graft
nicodvb
parents: 21448
diff changeset
2482 trfp = 0;
dd765bcd83aa added generalized teleciner by Donald Graft
nicodvb
parents: 21448
diff changeset
2483 for(i = 0; i < MAX_PATTERN_LENGTH; i++)
dd765bcd83aa added generalized teleciner by Donald Graft
nicodvb
parents: 21448
diff changeset
2484 {
dd765bcd83aa added generalized teleciner by Donald Graft
nicodvb
parents: 21448
diff changeset
2485 tfl += dfl;
dd765bcd83aa added generalized teleciner by Donald Graft
nicodvb
parents: 21448
diff changeset
2486 if(tfl >= source)
dd765bcd83aa added generalized teleciner by Donald Graft
nicodvb
parents: 21448
diff changeset
2487 {
dd765bcd83aa added generalized teleciner by Donald Graft
nicodvb
parents: 21448
diff changeset
2488 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
2489 bff_mask[i] = ormask[trfp + 1];
21467
dd765bcd83aa added generalized teleciner by Donald Graft
nicodvb
parents: 21448
diff changeset
2490 trfp ^= 2;
dd765bcd83aa added generalized teleciner by Donald Graft
nicodvb
parents: 21448
diff changeset
2491 }
dd765bcd83aa added generalized teleciner by Donald Graft
nicodvb
parents: 21448
diff changeset
2492 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
2493 bff_mask[i] = ormask[trfp];
21467
dd765bcd83aa added generalized teleciner by Donald Graft
nicodvb
parents: 21448
diff changeset
2494 }
dd765bcd83aa added generalized teleciner by Donald Graft
nicodvb
parents: 21448
diff changeset
2495 }
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
2496
24902
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2497 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
2498 {
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2499 muxer_priv_t *priv;
30702
9fc9d1e788aa Do not cast the results of malloc/calloc/realloc.
diego
parents: 30633
diff changeset
2500 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
2501 if(priv == NULL)
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2502 return 0;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2503 priv->update_system_header = 1;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
2504
24902
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2505 //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
2506
24902
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2507 if(conf_mux != NULL)
21467
dd765bcd83aa added generalized teleciner by Donald Graft
nicodvb
parents: 21448
diff changeset
2508 {
24902
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2509 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
2510 {
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2511 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
2512 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
2513 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
2514 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
2515 }
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2516 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
2517 {
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2518 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
2519 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
2520 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
2521 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
2522 }
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2523 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
2524 {
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2525 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
2526 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
2527 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
2528 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
2529 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
2530 }
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2531 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
2532 {
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2533 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
2534 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
2535 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
2536 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
2537 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
2538 }
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2539 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
2540 {
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2541 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
2542 priv->rawpes = 1;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2543 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
2544 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
2545 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
2546 }
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2547 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
2548 {
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2549 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
2550 priv->rawpes = 1;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2551 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
2552 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
2553 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
2554 }
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2555 else
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2556 {
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2557 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
2558 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
2559 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
2560 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
2561 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
2562 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
2563 }
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2564 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
2565
24902
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2566 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
2567 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
2568 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
2569 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
2570 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
2571 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
2572 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
2573 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
2574 setup_sys_params(priv);
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
2575
24902
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2576 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
2577 {
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2578 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
2579 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
2580 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
2581 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
2582 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
2583 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
2584 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
2585 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
2586 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
2587 else
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2588 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
2589 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
2590
24902
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2591 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
2592 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
2593 {
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: 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
2595 conf_vframerate = 0;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2596 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
2597
24902
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 == TELECINE_FILM2PAL)
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 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
2601 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
2602 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
2603 }
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2604 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
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 = 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
2608 conf_telecine = TELECINE_DGPULLDOWN;
21467
dd765bcd83aa added generalized teleciner by Donald Graft
nicodvb
parents: 21448
diff changeset
2609 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
2610
24902
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2611 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
2612 {
24902
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2613 int sfps, tfps;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
2614
24902
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2615 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
2616 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
2617 if(sfps % 2 || tfps % 2)
21486
37d60df833cc disable telecining when it can't be applied
nicodvb
parents: 21485
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 sfps *= 2;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2620 tfps *= 2;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2621 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
2622
24902
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2623 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
2624 {
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2625 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
2626 conf_telecine = 0;
37d60df833cc disable telecining when it can't be applied
nicodvb
parents: 21485
diff changeset
2627 }
24902
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2628 else
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2629 {
25720
333540254bb4 Put bff_mask into muxer context instead of a global variable.
reimar
parents: 25098
diff changeset
2630 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
2631 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
2632 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
2633 }
14914
8511347a0475 converted vframerate to CONF_TYPE_FLOAT
nicodvb
parents: 14894
diff changeset
2634 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
2635
24902
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2636 if(conf_vframerate)
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2637 {
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2638 int fps;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
2639
24902
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2640 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
2641 switch(fps)
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2642 {
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2643 case 24000:
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2644 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
2645 break;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2646 case 24024:
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2647 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
2648 break;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2649 case 25025:
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_25;
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 30000:
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_2997;
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 30030:
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_30;
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 50050:
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_50;
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 60000:
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_5994;
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 60060:
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_60;
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 default:
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2668 {
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2669 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
2670 if(conf_telecine)
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2671 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
2672 conf_telecine = 0;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2673 }
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 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
2676
24902
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2677 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
2678 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
2679 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
2680 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
2681 priv->vbitrate = ((conf_vbitrate) * 10) >> 2; //*1000 / 400
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 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
2684 {
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2685 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
2686 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
2687 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
2688 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
2689 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
2690 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
2691 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
2692 if(priv->vframerate)
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, " 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
2694 if(priv->vaspect)
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, " 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
2696 if(priv->vbitrate)
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, " 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
2698 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
2699 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
2700
24902
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2701 priv->has_video = priv->has_audio = 0;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
2702
24902
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2703 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
2704 priv->scr = muxer->file_end = 0;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
2705
24902
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2706 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
2707 {
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2708 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
2709 return 0;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2710 }
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2711 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
2712 priv->init_adelay = - (double) conf_init_adelay / (double) 1000.0;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
2713
24902
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2714 priv->drop = conf_drop;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
2715
30702
9fc9d1e788aa Do not cast the results of malloc/calloc/realloc.
diego
parents: 30633
diff changeset
2716 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
2717 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
2718 {
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2719 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
2720 return 0;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2721 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
2722
24902
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2723 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
2724 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
2725 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
2726 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
2727 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
2728 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
2729 return 1;
8585
27da710563c2 the long-waited MUXER layer, and new MPEG-PS muxer
arpi
parents:
diff changeset
2730 }