annotate libmpdemux/muxer_mpeg.c @ 35671:96adc233474d

Fix bug introduced in r35757. (A double size video is supposed to change its position in order to fit into the screen, see r34086.)
author ib
date Thu, 17 Jan 2013 16:39:05 +0000
parents eaace9a7e822
children 389d43c448b3
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
32618
de37221dff02 Support 0xff as tag for AAC audio and avoid an endless loop for unknown
reimar
parents: 32537
diff changeset
64 #define AUDIO_AAC3 0xFF
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
65
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
66 #define ASPECT_1_1 1
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
67 #define ASPECT_4_3 2
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
68 #define ASPECT_16_9 3
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
69 #define ASPECT_2_21_1 4
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
70
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
71 #define FRAMERATE_23976 1
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
72 #define FRAMERATE_24 2
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
73 #define FRAMERATE_25 3
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
74 #define FRAMERATE_2997 4
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
75 #define FRAMERATE_30 5
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
76 #define FRAMERATE_50 6
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
77 #define FRAMERATE_5994 7
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
78 #define FRAMERATE_60 8
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
79
35235
b5b0c0458d2c Add a few "const".
reimar
parents: 35234
diff changeset
80 static const char ftypes[] = {'?', 'I', 'P', 'B'};
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
81 #define FTYPE(x) (ftypes[(x)])
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
82
35235
b5b0c0458d2c Add a few "const".
reimar
parents: 35234
diff changeset
83 static const char * const framerates[] = {
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
84 "unchanged", "23.976", "24", "25", "29.97", "30", "50", "59.94", "60"
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
85 };
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
86
35235
b5b0c0458d2c Add a few "const".
reimar
parents: 35234
diff changeset
87 static const char * const aspect_ratios[] = {
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
88 "unchanged", "1/1", "4/3", "16/9", "2.21/1"
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
89 };
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
90
35235
b5b0c0458d2c Add a few "const".
reimar
parents: 35234
diff changeset
91 static const char *conf_mux = "mpeg2";
34279
b71060f1a007 conf_packet_size is used as CONF_TYPE_INT, which is a 32bit type (fixes possible memory corruption).
ranma
parents: 33841
diff changeset
92 static uint32_t conf_packet_size = 0; //dvd
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
93 static uint32_t conf_muxrate = 0; //kb/s
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
94 static float conf_vaspect = 0;
14914
8511347a0475 converted vframerate to CONF_TYPE_FLOAT
nicodvb
parents: 14894
diff changeset
95 static float conf_vframerate = 0;
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
96 static uint32_t conf_vwidth = 0, conf_vheight = 0, conf_panscan_width = 0, conf_panscan_height = 0;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
97 static uint32_t conf_vbitrate = 0;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
98 static int conf_init_vpts = 200, conf_init_apts = 200;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
99 static int conf_ts_allframes = 0;
22881
2d01760be338 removed init_apts and init_vpts; added :adelay in addition to :vdelay
nicodvb
parents: 22879
diff changeset
100 static int conf_init_adelay = 0, conf_init_vdelay = 0;
21413
06d63614eeaa permit to specify the sizes of the decoders' buffers
nicodvb
parents: 21372
diff changeset
101 static int conf_abuf_size = 0;
06d63614eeaa permit to specify the sizes of the decoders' buffers
nicodvb
parents: 21372
diff changeset
102 static int conf_vbuf_size = 0;
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
103 static int conf_drop = 0;
14840
d49482c5d8ac soft telecine support! :)) patch by nico
rfelker
parents: 14809
diff changeset
104 static int conf_telecine = 0;
22929
a60dbae6ee1d added :interleaving2, a better method to determine which stream whouls be flushed
nicodvb
parents: 22927
diff changeset
105 static int conf_interleaving2 = 0;
21467
dd765bcd83aa added generalized teleciner by Donald Graft
nicodvb
parents: 21448
diff changeset
106 static float conf_telecine_src = 0;
dd765bcd83aa added generalized teleciner by Donald Graft
nicodvb
parents: 21448
diff changeset
107 static float conf_telecine_dest = 0;
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
108
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
109 enum FRAME_TYPE {
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
110 I_FRAME = 1,
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
111 P_FRAME = 2,
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
112 B_FRAME = 3
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
113 };
8585
27da710563c2 the long-waited MUXER layer, and new MPEG-PS muxer
arpi
parents:
diff changeset
114
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
115 typedef struct {
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
116 uint8_t *buffer;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
117 size_t size;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
118 size_t alloc_size;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
119 uint8_t type;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
120 uint64_t pts, dts, idur;
15947
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
121 uint32_t pos; //start offset for the frame
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
122 } mpeg_frame_t;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
123
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
124 typedef struct {
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
125 uint8_t cnt; // how many entries we use
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
126 struct {
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
127 uint8_t id, type;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
128 uint32_t bufsize;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
129 uint32_t format;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
130 } streams[50]; //16 video + 16 audio mpa + 16 audio private + bd/bf for dvd
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
131 } sys_info_t;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
132
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
133 typedef struct {
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
134 uint8_t cnt; // how many entries we use
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
135 struct {
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
136 uint8_t id;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
137 uint8_t type;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
138 uint32_t format;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
139 } streams[50]; //16 video + 16 audio mpa + 16 audio private + bd/bf for dvd
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
140 } psm_info_t;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
141
18183
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
142 typedef struct {
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
143 int size;
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
144 uint64_t dts;
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
145 } buffer_track_t;
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
146
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
147 typedef struct {
18745
19cd9e0f8ac4 prevent buffer overflow in the STD; simplified fill_packet() (moving part of the code to get_packet_stats())
nicodvb
parents: 18558
diff changeset
148 uint64_t dts, pts;
19cd9e0f8ac4 prevent buffer overflow in the STD; simplified fill_packet() (moving part of the code to get_packet_stats())
nicodvb
parents: 18558
diff changeset
149 uint64_t frame_dts, frame_pts;
19cd9e0f8ac4 prevent buffer overflow in the STD; simplified fill_packet() (moving part of the code to get_packet_stats())
nicodvb
parents: 18558
diff changeset
150 int len, stflen;
19cd9e0f8ac4 prevent buffer overflow in the STD; simplified fill_packet() (moving part of the code to get_packet_stats())
nicodvb
parents: 18558
diff changeset
151 } pack_stats_t;
19cd9e0f8ac4 prevent buffer overflow in the STD; simplified fill_packet() (moving part of the code to get_packet_stats())
nicodvb
parents: 18558
diff changeset
152
19cd9e0f8ac4 prevent buffer overflow in the STD; simplified fill_packet() (moving part of the code to get_packet_stats())
nicodvb
parents: 18558
diff changeset
153 typedef struct {
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
154 int mux;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
155 sys_info_t sys_info;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
156 psm_info_t psm_info;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
157 uint16_t packet_size;
21141
33cce0f7e66c permit muxing to raw pes (VDR uses this)
nicodvb
parents: 20344
diff changeset
158 int is_dvd, is_xvcd, is_xsvcd, is_genmpeg1, is_genmpeg2, rawpes, ts_allframes, has_video, has_audio;
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
159 int update_system_header, use_psm;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
160 off_t headers_size, data_size;
18200
b8a94743afec removed more unused code and struct members
nicodvb
parents: 18199
diff changeset
161 uint64_t scr;
18183
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
162 uint64_t delta_scr;
24904
75e930e20f48 repeat the PSM once every second (in terms of delta_scr) otherwise playing the file from the middle would miss the first instance
nicodvb
parents: 24903
diff changeset
163 uint64_t last_psm_scr;
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
164 uint32_t muxrate;
18200
b8a94743afec removed more unused code and struct members
nicodvb
parents: 18199
diff changeset
165 uint8_t *buff;
17271
9e20b0073d9b simplification: don't use residual_buffer, but prepend remainder of current frame to next one (needed for future work; init frame->pos to 0 in reorder_frame(); fix: don't go beyond last frame in flush_buffer()
nicodvb
parents: 17091
diff changeset
166 uint32_t headers_cnt;
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
167 double init_adelay;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
168 int drop;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
169
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
170 //video patching parameters
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
171 uint8_t vaspect, vframerate;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
172 uint16_t vwidth, vheight, panscan_width, panscan_height;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
173 uint32_t vbitrate;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
174 int patch_seq, patch_sde;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
175 int psm_streams_cnt;
25720
333540254bb4 Put bff_mask into muxer context instead of a global variable.
reimar
parents: 25098
diff changeset
176
333540254bb4 Put bff_mask into muxer context instead of a global variable.
reimar
parents: 25098
diff changeset
177 //2 million frames are enough
333540254bb4 Put bff_mask into muxer context instead of a global variable.
reimar
parents: 25098
diff changeset
178 #define MAX_PATTERN_LENGTH 2000000
333540254bb4 Put bff_mask into muxer context instead of a global variable.
reimar
parents: 25098
diff changeset
179 uint8_t bff_mask[MAX_PATTERN_LENGTH];
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
180 } muxer_priv_t;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
181
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
182
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
183 typedef struct {
24906
e3fec0def910 removed no more needed variable
nicodvb
parents: 24905
diff changeset
184 int has_pts, has_dts, pes_is_aligned, type, min_pes_hlen;
22328
42d21ca22e7e member real_framerate is completely useless
nicodvb
parents: 22323
diff changeset
185 int delay_rff;
18200
b8a94743afec removed more unused code and struct members
nicodvb
parents: 18199
diff changeset
186 uint64_t pts, last_pts, last_dts, dts, size, frame_duration, delta_pts, nom_delta_pts, last_saved_pts;
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
187 uint32_t buffer_size;
18200
b8a94743afec removed more unused code and struct members
nicodvb
parents: 18199
diff changeset
188 double delta_clock, timer;
18181
afaa492536f6 new code to simplify assignment of timestamps; removed temp_ref from mpeg_frame_t and modified add_frame() accordingly; removed no more used drop_delayed_audio() and save_delayed_audio()
nicodvb
parents: 18166
diff changeset
189 int drop_delayed_frames;
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
190 mpeg_frame_t *framebuf;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
191 uint16_t framebuf_cnt;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
192 uint16_t framebuf_used;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
193 int32_t last_tr;
14880
991f5a7b1b7d telecine now works in display order (rather than decoding), as far as there are no more than 4 consecutive b-frames; added support for FMP4
nicodvb
parents: 14840
diff changeset
194 int max_tr;
17301
bbf5438d646a removed previously forgotten reording options/flags
nicodvb
parents: 17298
diff changeset
195 uint8_t id, is_mpeg12, telecine;
14840
d49482c5d8ac soft telecine support! :)) patch by nico
rfelker
parents: 14809
diff changeset
196 uint64_t vframes;
21485
2d87895e58fb since display_frames in increased by a possibly negative number it had better be signed
nicodvb
parents: 21484
diff changeset
197 int64_t display_frame;
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
198 mp_mpeg_header_t picture;
18183
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
199 int max_buffer_size;
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
200 buffer_track_t *buffer_track;
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
201 int track_pos, track_len, track_bufsize; //pos and len control the array, bufsize is the size of the buffer
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
202 unsigned char *pack;
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
203 int pack_offset, pes_offset, pes_set, payload_offset;
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
204 int frames;
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
205 int last_frame_rest; //the rest of the previous frame
18181
afaa492536f6 new code to simplify assignment of timestamps; removed temp_ref from mpeg_frame_t and modified add_frame() accordingly; removed no more used drop_delayed_audio() and save_delayed_audio()
nicodvb
parents: 18166
diff changeset
206 int is_ready;
18248
595d94213ad0 when muxing mpeg audio streams analyze the first 32 KB of data to obtain the most likely correct layer, otherwise every misdetection during parse_audio() will lead to wrong timestamps and loss of synchrony
nicodvb
parents: 18238
diff changeset
207 int mpa_layer;
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
208 } muxer_headers_t;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
209
17600
6fa1149d8c80 experimental film2pal and ntsc2pal soft teleciner
nicodvb
parents: 17591
diff changeset
210 #define PULLDOWN32 1
6fa1149d8c80 experimental film2pal and ntsc2pal soft teleciner
nicodvb
parents: 17591
diff changeset
211 #define TELECINE_FILM2PAL 2
21467
dd765bcd83aa added generalized teleciner by Donald Graft
nicodvb
parents: 21448
diff changeset
212 #define TELECINE_DGPULLDOWN 3
8585
27da710563c2 the long-waited MUXER layer, and new MPEG-PS muxer
arpi
parents:
diff changeset
213
30958
d05a77bed63f Mark muxer-related m_option_t arrays as const.
diego
parents: 30702
diff changeset
214 const m_option_t mpegopts_conf[] = {
22243
e085c85b29af all options must be GLOBAL; patch by Trent Piepho (xyzzy speakeasy org)
nicodvb
parents: 22142
diff changeset
215 {"format", &(conf_mux), CONF_TYPE_STRING, M_OPT_GLOBAL, 0 ,0, NULL},
e085c85b29af all options must be GLOBAL; patch by Trent Piepho (xyzzy speakeasy org)
nicodvb
parents: 22142
diff changeset
216 {"size", &(conf_packet_size), CONF_TYPE_INT, M_OPT_GLOBAL|M_OPT_RANGE, 0, 65535, NULL},
e085c85b29af all options must be GLOBAL; patch by Trent Piepho (xyzzy speakeasy org)
nicodvb
parents: 22142
diff changeset
217 {"muxrate", &(conf_muxrate), CONF_TYPE_INT, M_OPT_GLOBAL|M_OPT_RANGE, 0, 12000000, NULL}, //12 Mb/s
e085c85b29af all options must be GLOBAL; patch by Trent Piepho (xyzzy speakeasy org)
nicodvb
parents: 22142
diff changeset
218 {"vaspect", &(conf_vaspect), CONF_TYPE_FLOAT, M_OPT_GLOBAL, 0, 0, NULL},
e085c85b29af all options must be GLOBAL; patch by Trent Piepho (xyzzy speakeasy org)
nicodvb
parents: 22142
diff changeset
219 {"vframerate", &(conf_vframerate), CONF_TYPE_FLOAT, M_OPT_GLOBAL, 0, 0, NULL},
e085c85b29af all options must be GLOBAL; patch by Trent Piepho (xyzzy speakeasy org)
nicodvb
parents: 22142
diff changeset
220 {"vwidth", &(conf_vwidth), CONF_TYPE_INT, M_OPT_GLOBAL|M_OPT_RANGE, 1, 4095, NULL},
e085c85b29af all options must be GLOBAL; patch by Trent Piepho (xyzzy speakeasy org)
nicodvb
parents: 22142
diff changeset
221 {"vheight", &(conf_vheight), CONF_TYPE_INT, M_OPT_GLOBAL|M_OPT_RANGE, 1, 4095, NULL},
e085c85b29af all options must be GLOBAL; patch by Trent Piepho (xyzzy speakeasy org)
nicodvb
parents: 22142
diff changeset
222 {"vpswidth", &(conf_panscan_width), CONF_TYPE_INT, M_OPT_GLOBAL|M_OPT_RANGE, 1, 16383, NULL},
e085c85b29af all options must be GLOBAL; patch by Trent Piepho (xyzzy speakeasy org)
nicodvb
parents: 22142
diff changeset
223 {"vpsheight", &(conf_panscan_height), CONF_TYPE_INT, M_OPT_GLOBAL|M_OPT_RANGE, 1, 16383, NULL},
e085c85b29af all options must be GLOBAL; patch by Trent Piepho (xyzzy speakeasy org)
nicodvb
parents: 22142
diff changeset
224 {"vbitrate", &(conf_vbitrate), CONF_TYPE_INT, M_OPT_GLOBAL|M_OPT_RANGE, 1, 104857599, NULL},
22881
2d01760be338 removed init_apts and init_vpts; added :adelay in addition to :vdelay
nicodvb
parents: 22879
diff changeset
225 {"vdelay", &conf_init_vdelay, CONF_TYPE_INT, M_OPT_GLOBAL|M_OPT_RANGE, 0, 32760, NULL},
2d01760be338 removed init_apts and init_vpts; added :adelay in addition to :vdelay
nicodvb
parents: 22879
diff changeset
226 {"adelay", &conf_init_adelay, CONF_TYPE_INT, M_OPT_GLOBAL|M_OPT_RANGE, 0, 32760, NULL},
22243
e085c85b29af all options must be GLOBAL; patch by Trent Piepho (xyzzy speakeasy org)
nicodvb
parents: 22142
diff changeset
227 {"vbuf_size", &conf_vbuf_size, CONF_TYPE_INT, M_OPT_GLOBAL|M_OPT_RANGE, 40, 1194, NULL},
e085c85b29af all options must be GLOBAL; patch by Trent Piepho (xyzzy speakeasy org)
nicodvb
parents: 22142
diff changeset
228 {"abuf_size", &conf_abuf_size, CONF_TYPE_INT, M_OPT_GLOBAL|M_OPT_RANGE, 4, 64, NULL},
e085c85b29af all options must be GLOBAL; patch by Trent Piepho (xyzzy speakeasy org)
nicodvb
parents: 22142
diff changeset
229 {"drop", &conf_drop, CONF_TYPE_FLAG, M_OPT_GLOBAL, 0, 1, NULL},
e085c85b29af all options must be GLOBAL; patch by Trent Piepho (xyzzy speakeasy org)
nicodvb
parents: 22142
diff changeset
230 {"tsaf", &conf_ts_allframes, CONF_TYPE_FLAG, M_OPT_GLOBAL, 0, 1, NULL},
e085c85b29af all options must be GLOBAL; patch by Trent Piepho (xyzzy speakeasy org)
nicodvb
parents: 22142
diff changeset
231 {"telecine", &conf_telecine, CONF_TYPE_FLAG, M_OPT_GLOBAL, 0, PULLDOWN32, NULL},
22929
a60dbae6ee1d added :interleaving2, a better method to determine which stream whouls be flushed
nicodvb
parents: 22927
diff changeset
232 {"interleaving2", &conf_interleaving2, CONF_TYPE_FLAG, M_OPT_GLOBAL, 0, 1, NULL},
22243
e085c85b29af all options must be GLOBAL; patch by Trent Piepho (xyzzy speakeasy org)
nicodvb
parents: 22142
diff changeset
233 {"film2pal", &conf_telecine, CONF_TYPE_FLAG, M_OPT_GLOBAL, 0, TELECINE_FILM2PAL, NULL},
e085c85b29af all options must be GLOBAL; patch by Trent Piepho (xyzzy speakeasy org)
nicodvb
parents: 22142
diff changeset
234 {"tele_src", &(conf_telecine_src), CONF_TYPE_FLOAT, M_OPT_GLOBAL, 0, 0, NULL},
e085c85b29af all options must be GLOBAL; patch by Trent Piepho (xyzzy speakeasy org)
nicodvb
parents: 22142
diff changeset
235 {"tele_dest", &(conf_telecine_dest), CONF_TYPE_FLOAT, M_OPT_GLOBAL, 0, 0, NULL},
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
236 {NULL, NULL, 0, 0, 0, 0, NULL}
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
237 };
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
238
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
239 static void fix_audio_sys_header(muxer_priv_t *priv, uint8_t id, uint8_t newid, uint32_t size)
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
240 {
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
241 uint8_t i;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
242
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
243 for(i = 0; i < priv->sys_info.cnt; i++)
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
244 {
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
245 if(priv->sys_info.streams[i].id == id)
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
246 {
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
247 priv->sys_info.streams[i].id = newid;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
248 priv->sys_info.streams[i].type = 1;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
249 priv->sys_info.streams[i].bufsize = size;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
250 }
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
251 }
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
252 }
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
253
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
254 static inline int is_mpeg1(uint32_t x)
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
255 {
26758
9fb1d2c3dbd4 cosmetics: Remove pointless parentheses from return statements.
diego
parents: 26570
diff changeset
256 return
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
257 (x == 0x10000001) ||
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
258 (x == mmioFOURCC('m','p','g','1')) ||
26758
9fb1d2c3dbd4 cosmetics: Remove pointless parentheses from return statements.
diego
parents: 26570
diff changeset
259 (x == mmioFOURCC('M','P','G','1'));
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
260 }
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
261
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
262 static inline int is_mpeg2(uint32_t x)
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
263 {
26758
9fb1d2c3dbd4 cosmetics: Remove pointless parentheses from return statements.
diego
parents: 26570
diff changeset
264 return
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
265 (x == 0x10000002) ||
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
266 (x == mmioFOURCC('m','p','g','2')) ||
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
267 (x == mmioFOURCC('M','P','G','2')) ||
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
268 (x == mmioFOURCC('m','p','e','g')) ||
26758
9fb1d2c3dbd4 cosmetics: Remove pointless parentheses from return statements.
diego
parents: 26570
diff changeset
269 (x == mmioFOURCC('M','P','E','G'));
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
270 }
8585
27da710563c2 the long-waited MUXER layer, and new MPEG-PS muxer
arpi
parents:
diff changeset
271
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
272 static inline int is_mpeg4(uint32_t x)
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
273 {
26758
9fb1d2c3dbd4 cosmetics: Remove pointless parentheses from return statements.
diego
parents: 26570
diff changeset
274 return
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
275 (x == 0x10000004) ||
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
276 (x == mmioFOURCC('d','i','v','x')) ||
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
277 (x == mmioFOURCC('D','I','V','X')) ||
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
278 (x == mmioFOURCC('x','v','i','d')) ||
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
279 (x == mmioFOURCC('X','V','I','D')) ||
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
280 (x == mmioFOURCC('X','v','i','D')) ||
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
281 (x == mmioFOURCC('x','v','i','x')) ||
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
282 (x == mmioFOURCC('X','V','I','X')) ||
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
283 (x == mmioFOURCC('m','p','4','v')) ||
14880
991f5a7b1b7d telecine now works in display order (rather than decoding), as far as there are no more than 4 consecutive b-frames; added support for FMP4
nicodvb
parents: 14840
diff changeset
284 (x == mmioFOURCC('M','P','4','V')) ||
991f5a7b1b7d telecine now works in display order (rather than decoding), as far as there are no more than 4 consecutive b-frames; added support for FMP4
nicodvb
parents: 14840
diff changeset
285 (x == mmioFOURCC('F', 'M','P','4')) ||
18164
c692440493c8 added support for DX50 and dx50 4CCs
nicodvb
parents: 18163
diff changeset
286 (x == mmioFOURCC('f', 'm','p','4')) ||
c692440493c8 added support for DX50 and dx50 4CCs
nicodvb
parents: 18163
diff changeset
287 (x == mmioFOURCC('D', 'X','5','0')) ||
26758
9fb1d2c3dbd4 cosmetics: Remove pointless parentheses from return statements.
diego
parents: 26570
diff changeset
288 (x == mmioFOURCC('d', 'x','5','0'));
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
289 }
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
290
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
291 //from unrarlib.c
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
292 static uint32_t CalcCRC32(uint8_t *buff, uint32_t size)
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
293 {
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
294 uint32_t i, j, CRCTab[256], crc;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
295
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
296 for(i = 0;i < 256; i++)
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
297 {
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
298 for(crc = i, j = 0; j < 8; j++)
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
299 crc= (crc & 1) ? (crc >> 1)^0xEDB88320L : (crc >> 1);
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
300 CRCTab[i] = crc;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
301 }
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
302
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
303
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
304 crc = 0xffffffff;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
305 for(i = 0; i < size; i++)
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
306 crc = (crc << 8) ^ CRCTab[((crc >> 24) ^ buff[i]) & 0xff];
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
307
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
308 return crc;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
309 }
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
310
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
311
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
312 static void add_to_psm(muxer_priv_t *priv, uint8_t id, uint32_t format)
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
313 {
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
314 uint8_t i;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
315
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
316 i = priv->psm_info.cnt;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
317 priv->psm_info.streams[i].id = id;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
318 priv->psm_info.streams[i].format = format;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
319
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
320 if(is_mpeg1(format))
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
321 priv->psm_info.streams[i].type = 0x01;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
322 else if(is_mpeg2(format))
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
323 priv->psm_info.streams[i].type = 0x02;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
324 else if(is_mpeg4(format))
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
325 priv->psm_info.streams[i].type = 0x10;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
326 else if(format == AUDIO_MP2 || format == AUDIO_MP3)
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
327 priv->psm_info.streams[i].type = 0x03;
32618
de37221dff02 Support 0xff as tag for AAC audio and avoid an endless loop for unknown
reimar
parents: 32537
diff changeset
328 else if(format == AUDIO_AAC1 || format == AUDIO_AAC2 || format == AUDIO_AAC3)
15278
a45c7e1b998f added support for AAC; moved most of MSGL_V to MSGL_DBG2 to reduce verbosity
nicodvb
parents: 15083
diff changeset
329 priv->psm_info.streams[i].type = 0x0f;
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
330 else
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
331 priv->psm_info.streams[i].type = 0x81;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
332
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
333 if(format == AUDIO_A52)
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
334 memcpy((char*) &(priv->psm_info.streams[i].format), "AC-3", 4);
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
335
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
336 priv->psm_info.cnt++;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
337 }
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
338
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
339
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
340 static mpeg_frame_t *init_frames(uint16_t num, size_t size)
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
341 {
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
342 mpeg_frame_t *tmp;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
343 uint16_t i;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
344
30702
9fc9d1e788aa Do not cast the results of malloc/calloc/realloc.
diego
parents: 30633
diff changeset
345 tmp = calloc(num, sizeof(mpeg_frame_t));
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
346 if(tmp == NULL)
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
347 return NULL;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
348
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
349 for(i=0; i < num; i++)
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
350 {
30702
9fc9d1e788aa Do not cast the results of malloc/calloc/realloc.
diego
parents: 30633
diff changeset
351 tmp[i].buffer = calloc(1, size);
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
352 if(tmp[i].buffer == NULL)
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
353 return NULL;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
354 tmp[i].size = 0;
17298
104b09de82b9 removed broken frame reording code; unified audio and video frame storing code (in memory, not in the packets); simple workaround to handle non-standard framerate mpeg1/2 video
nicodvb
parents: 17271
diff changeset
355 tmp[i].pos = 0;
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
356 tmp[i].alloc_size = size;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
357 tmp[i].pts = 0;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
358 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
359
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
360 return tmp;
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
361 }
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
362
18181
afaa492536f6 new code to simplify assignment of timestamps; removed temp_ref from mpeg_frame_t and modified add_frame() accordingly; removed no more used drop_delayed_audio() and save_delayed_audio()
nicodvb
parents: 18166
diff changeset
363 static int add_frame(muxer_headers_t *spriv, uint64_t idur, uint8_t *ptr, int len, uint8_t pt, uint64_t dts, uint64_t pts);
8585
27da710563c2 the long-waited MUXER layer, and new MPEG-PS muxer
arpi
parents:
diff changeset
364
27da710563c2 the long-waited MUXER layer, and new MPEG-PS muxer
arpi
parents:
diff changeset
365 static muxer_stream_t* mpegfile_new_stream(muxer_t *muxer,int type){
35314
eaace9a7e822 Simplify: remove useless casts, NULL checks etc.
reimar
parents: 35236
diff changeset
366 muxer_priv_t *priv = muxer->priv;
8585
27da710563c2 the long-waited MUXER layer, and new MPEG-PS muxer
arpi
parents:
diff changeset
367 muxer_stream_t *s;
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
368 muxer_headers_t *spriv;
8585
27da710563c2 the long-waited MUXER layer, and new MPEG-PS muxer
arpi
parents:
diff changeset
369
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;
35314
eaace9a7e822 Simplify: remove useless casts, NULL checks etc.
reimar
parents: 35236
diff changeset
575 muxer_priv_t *priv = muxer->priv;
31618
9318ad289bb0 Use AV_WB* where possible and be2me -> be2ne compilation fix.
reimar
parents: 31090
diff changeset
576 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
577 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
578 {
70c446099f40 new mpeg 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 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
580 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
581 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
582 }
70c446099f40 new mpeg 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 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
584 {
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
585 write_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
586 write_mpeg_rate(priv->mux, &buff[10], muxer->sysrate);
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
587 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
588 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
589 }
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
590
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
591 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
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
70c446099f40 new mpeg 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 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
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 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
598 uint8_t i;
35314
eaace9a7e822 Simplify: remove useless casts, NULL checks etc.
reimar
parents: 35236
diff changeset
599 muxer_priv_t *priv = muxer->priv;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
600
14753
70c446099f40 new mpeg 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 len = 0;
31618
9318ad289bb0 Use AV_WB* where possible and be2me -> be2ne compilation fix.
reimar
parents: 31090
diff changeset
602 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
603 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
604 *(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
605 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
606 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
607 len += 3;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
608
14753
70c446099f40 new mpeg 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 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
610 //stolen from libavformat
a8f534c4e071 in the system header set audio_locked/video_locked only for dvd and vcd
nicodvb
parents: 22924
diff changeset
611 if(priv->is_xvcd || priv->is_dvd)
22926
92c92f168648 reindentation
nicodvb
parents: 22925
diff changeset
612 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
613 else
22926
92c92f168648 reindentation
nicodvb
parents: 22925
diff changeset
614 buff[len++] = 0x21; //marker, 1 video stream bound
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
615
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
616 buff[len++] = ((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
617
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
618 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
619 {
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
620 buff[len++] = priv->sys_info.streams[i].id;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
621 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
622 (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
623 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
624 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
625
31618
9318ad289bb0 Use AV_WB* where possible and be2me -> be2ne compilation fix.
reimar
parents: 31090
diff changeset
626 AV_WB16(&buff[4], len - 6); // length field fixed
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
627
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
628 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
629 }
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
630
70c446099f40 new mpeg 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 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
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 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
634 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
635 uint16_t dlen;
31618
9318ad289bb0 Use AV_WB* where possible and be2me -> be2ne compilation fix.
reimar
parents: 31090
diff changeset
636 uint32_t crc;
35314
eaace9a7e822 Simplify: remove useless casts, NULL checks etc.
reimar
parents: 35236
diff changeset
637 muxer_priv_t *priv = muxer->priv;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
638
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
639 len = 0;
31618
9318ad289bb0 Use AV_WB* where possible and be2me -> be2ne compilation fix.
reimar
parents: 31090
diff changeset
640 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
641 len += 4;
31618
9318ad289bb0 Use AV_WB* where possible and be2me -> be2ne compilation fix.
reimar
parents: 31090
diff changeset
642 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
643 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
644 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
645 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
646 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
647 len += 2;
31618
9318ad289bb0 Use AV_WB* where possible and be2me -> be2ne compilation fix.
reimar
parents: 31090
diff changeset
648 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
649 len += 2;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
650
14753
70c446099f40 new mpeg 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 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
652 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
653 {
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
654 if(
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
655 (priv->psm_info.streams[i].id == 0xbd) ||
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
656 (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
657 (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
658 )
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
659 {
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
660 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
661 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
662 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
663 buff[len++] = 0; //... lower
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
664
24903
b4cdc74f4496 remove the registration descriptor from the PSM: writing the fourcc in it makes it total crap
nicodvb
parents: 24902
diff changeset
665 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
666 }
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
667 }
31618
9318ad289bb0 Use AV_WB* where possible and be2me -> be2ne compilation fix.
reimar
parents: 31090
diff changeset
668 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
669
9318ad289bb0 Use AV_WB* where possible and be2me -> be2ne compilation fix.
reimar
parents: 31090
diff changeset
670 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
671
9318ad289bb0 Use AV_WB* where possible and be2me -> be2ne compilation fix.
reimar
parents: 31090
diff changeset
672 crc = CalcCRC32(buff, len);
9318ad289bb0 Use AV_WB* where possible and be2me -> be2ne compilation fix.
reimar
parents: 31090
diff changeset
673 AV_WB32(&buff[len], crc);
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
674
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
675 len += 4; //for crc
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
676
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
677 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
678 }
70c446099f40 new mpeg 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
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
680 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
681 {
26758
9fb1d2c3dbd4 cosmetics: Remove pointless parentheses from return statements.
diego
parents: 26570
diff changeset
682 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
683 }
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
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
685 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
686 {
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
687 int len;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
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 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
690 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
691 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
692
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
693 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
694 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
695
70c446099f40 new mpeg 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 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
697 {
70c446099f40 new mpeg 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 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
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 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
701 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
702 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
703
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
704 if(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
705 {
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
706 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
707 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
708 }
70c446099f40 new mpeg 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 }
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
710 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
711 {
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
712 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
713 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
714 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
715 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
716 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
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 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
719
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
720
14753
70c446099f40 new mpeg 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 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
722 {
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
723 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
724 len += 5;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
725
14753
70c446099f40 new mpeg 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 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
727 {
70c446099f40 new mpeg 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 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
729 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
730 }
70c446099f40 new mpeg 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 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
733 {
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
734 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
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 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
737 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
738 }
70c446099f40 new mpeg 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
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
741
14753
70c446099f40 new mpeg 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 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
743 {
14753
70c446099f40 new mpeg 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 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
745 {
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
746 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
747 len++;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
748
14753
70c446099f40 new mpeg 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 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
750 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
751 }
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 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
754 {
70c446099f40 new mpeg 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 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
756 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
757 }
70c446099f40 new mpeg 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
31618
9318ad289bb0 Use AV_WB* where possible and be2me -> be2ne compilation fix.
reimar
parents: 31090
diff changeset
760 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
761 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
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
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
764
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
765 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
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 //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
768 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
769 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
770 buff[3] = 0xbe;
31618
9318ad289bb0 Use AV_WB* where possible and be2me -> be2ne compilation fix.
reimar
parents: 31090
diff changeset
771 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
772 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
773 }
70c446099f40 new mpeg 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
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
775
70c446099f40 new mpeg 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 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
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 // 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
779 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
780
15278
a45c7e1b998f added support for AAC; moved most of MSGL_V to MSGL_DBG2 to reduce verbosity
nicodvb
parents: 15083
diff changeset
781 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
782 len = 0;
31618
9318ad289bb0 Use AV_WB* where possible and be2me -> be2ne compilation fix.
reimar
parents: 31090
diff changeset
783 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
784 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
785 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
786 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
787 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
788 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
789
31618
9318ad289bb0 Use AV_WB* where possible and be2me -> be2ne compilation fix.
reimar
parents: 31090
diff changeset
790 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
791 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
792 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
793 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
794 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
795 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
796
70c446099f40 new mpeg 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 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
798 }
70c446099f40 new mpeg 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
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
800 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
801 {
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
802 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
803 }
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
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
805 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
806 {
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
807 uint32_t len;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
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 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
810 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
811 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
812 len = 9;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
813
14753
70c446099f40 new mpeg 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 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
815 {
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
816 len += 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
817 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
818 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
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 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
821 len += 1;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
822
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
823 if(h->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
824 {
70c446099f40 new mpeg 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 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
826 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
827 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
828 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
829 }
70c446099f40 new mpeg 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
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
831 //len = max(h->min_pes_hlen, len);
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
832
14753
70c446099f40 new mpeg 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 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
834 }
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
835
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
836
21660
ca9da45d13e9 muxers now write to output muxer->stream rather than to muxer->file
nicodvb
parents: 21544
diff changeset
837 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
838 {
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
839 size_t tot, offset;
35314
eaace9a7e822 Simplify: remove useless casts, NULL checks etc.
reimar
parents: 35236
diff changeset
840 muxer_priv_t *priv = muxer->priv;
eaace9a7e822 Simplify: remove useless casts, NULL checks etc.
reimar
parents: 35236
diff changeset
841 unsigned char *buff = priv->buff;
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
842 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
843
70c446099f40 new mpeg 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 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
845 {
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
846 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
847 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
848 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
849 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
850 buff[offset + 3] = 0xb9;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
851
21660
ca9da45d13e9 muxers now write to output muxer->stream rather than to muxer->file
nicodvb
parents: 21544
diff changeset
852 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
853 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
854 }
18196
f7f6984638f8 finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents: 18192
diff changeset
855 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
856 {
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
857 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
858 offset += write_mpeg_system_header(muxer, &buff[offset]);
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
859
14753
70c446099f40 new mpeg 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 //priv->update_system_header = 0;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
861
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
862 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
863 offset += write_nav_pack(&buff[offset]);
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
864
14753
70c446099f40 new mpeg 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 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
866 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
867 {
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
868 //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
869 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
870 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
871 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
872
21660
ca9da45d13e9 muxers now write to output muxer->stream rather than to muxer->file
nicodvb
parents: 21544
diff changeset
873 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
874 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
875 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
876 muxer->movi_end += tot;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
877
14753
70c446099f40 new mpeg 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 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
879 }
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
880 }
70c446099f40 new mpeg 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
22142
84f95595f31f Fix a few gcc warnings, approved by Diego and Reimar.
rathann
parents: 21660
diff changeset
882 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
883 {
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
884 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
885
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
886 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
887 {
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
888 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
889 if(!tmp)
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 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
892 return;
18183
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
893 }
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
894 spriv->buffer_track = tmp;
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
895 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
896 spriv->track_len += 16;
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
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
899 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
900 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
901
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
902 spriv->track_pos++;
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
903 }
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
904
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
905 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
906 {
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
907 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
908 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
909
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
910 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
911 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
912 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
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 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
915 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
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 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
918 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
919 }
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
18197
5b06a0b9908e moved inline at beginning of declaration
nicodvb
parents: 18196
diff changeset
921 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
922 {
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
923 mpeg_frame_t tmp;
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
924 int i;
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
925
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
926 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
927 {
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
928 tmp = spriv->framebuf[i - n];
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
929 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
930 spriv->framebuf[i] = tmp;
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
931 }
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
932 spriv->framebuf_used -= n;
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
933 }
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
934
18192
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
935 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
936 {
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
937 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
938 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
939
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
940 n = len = 0;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
941 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
942 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
943 {
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
944 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
945 return len;
21531
a90aa203186c Get rid of min/max macros from aviheader.h, they do not belong here.
reimar
parents: 21486
diff changeset
946 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
947 len += m;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
948 frpos += m;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
949 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
950 {
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
951 frpos = 0;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
952 n++;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
953 }
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
954 }
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
955
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
956 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
957 return 0;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
958 return len;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
959 }
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
960
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
961 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
962 {
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
963 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
964 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
965 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
966
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
967 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
968 return 0;
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 spts = spriv->pts;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
971 sdts = spriv->dts;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
972 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
973 ret = 0;
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[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
975 i = 0;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
976 else
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
977 {
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
978 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
979
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
980 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
981 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
982
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
983 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
984
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
985 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
986 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
987 else
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
988 {
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
989 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
990 goto fail;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
991
18192
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
992 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
993 threshold = 5;
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 threshold = 10;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
996
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
997 //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
998 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
999 i = 1;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1000 else
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1001 i = -1;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1002 }
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1003 }
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1004
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1005 if(i > -1)
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1006 {
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1007 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
1008 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
1009 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
1010
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1011 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
1012 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
1013 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
1014 ret = 1;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1015
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1016 if(ret)
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 *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
1019 *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
1020 if(*dts == *pts)
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1021 *dts = 0;
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 }
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 fail:
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1026 spriv->pts = spts;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1027 spriv->dts = sdts;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1028 return ret;
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
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
1031 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
1032 {
19cd9e0f8ac4 prevent buffer overflow in the STD; simplified fill_packet() (moving part of the code to get_packet_stats())
nicodvb
parents: 18558
diff changeset
1033 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
1034 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
1035 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
1036
19cd9e0f8ac4 prevent buffer overflow in the STD; simplified fill_packet() (moving part of the code to get_packet_stats())
nicodvb
parents: 18558
diff changeset
1037 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
1038 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
1039 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
1040
21141
33cce0f7e66c permit muxing to raw pes (VDR uses this)
nicodvb
parents: 20344
diff changeset
1041 if(priv->rawpes)
33cce0f7e66c permit muxing to raw pes (VDR uses this)
nicodvb
parents: 20344
diff changeset
1042 pack_hlen = 0;
33cce0f7e66c permit muxing to raw pes (VDR uses this)
nicodvb
parents: 20344
diff changeset
1043 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
1044 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
1045 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
1046 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
1047 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
1048 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
1049
19cd9e0f8ac4 prevent buffer overflow in the STD; simplified fill_packet() (moving part of the code to get_packet_stats())
nicodvb
parents: 18558
diff changeset
1050 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
1051 {
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 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
1053 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
1054
19cd9e0f8ac4 prevent buffer overflow in the STD; simplified fill_packet() (moving part of the code to get_packet_stats())
nicodvb
parents: 18558
diff changeset
1055 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
1056 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
1057 }
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 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
1059
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->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
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 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
1063 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
1064 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
1065 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
1066 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
1067
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 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
1069 target -= hlen;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1070
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
1071 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
1072 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
1073 {
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 //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
1075 //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
1076 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
1077 //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
1078 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
1079 }
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 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
1082 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
1083 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
1084 {
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 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
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 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
1088 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
1089 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
1090 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
1091 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
1092 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
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
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 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
1096 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
1097 {
19cd9e0f8ac4 prevent buffer overflow in the STD; simplified fill_packet() (moving part of the code to get_packet_stats())
nicodvb
parents: 18558
diff changeset
1098 if(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
1099 {
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 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
1101 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
1102 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
1103 }
19cd9e0f8ac4 prevent buffer overflow in the STD; simplified fill_packet() (moving part of the code to get_packet_stats())
nicodvb
parents: 18558
diff changeset
1104 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
1105 {
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 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
1107 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
1108 }
19cd9e0f8ac4 prevent buffer overflow in the STD; simplified fill_packet() (moving part of the code to get_packet_stats())
nicodvb
parents: 18558
diff changeset
1109 }
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 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1111
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
1112 len += hlen;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1113
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
1114 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
1115 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
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 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
1118 }
18192
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1119
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1120 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
1121 {
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1122 //try to fill a packet as much as possible
25962
afa125da85cf typo fix: inited --> initialized
diego
parents: 25720
diff changeset
1123 //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
1124 //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
1125 //if audio and a52 insert the headers
35314
eaace9a7e822 Simplify: remove useless casts, NULL checks etc.
reimar
parents: 35236
diff changeset
1126 muxer_priv_t *priv = muxer->priv;
eaace9a7e822 Simplify: remove useless casts, NULL checks etc.
reimar
parents: 35236
diff changeset
1127 muxer_headers_t *spriv = s->priv;
18958
a8e681ad7c90 Remove unused variables, patch by Stefan Huehner stefan at huehner org.
diego
parents: 18751
diff changeset
1128 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
1129 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
1130 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
1131 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
1132
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
1133 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
1134
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1135 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
1136 {
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1137 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
1138 return 0;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1139 }
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1140
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1141 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
1142 {
21141
33cce0f7e66c permit muxing to raw pes (VDR uses this)
nicodvb
parents: 20344
diff changeset
1143 if(priv->rawpes)
33cce0f7e66c permit muxing to raw pes (VDR uses this)
nicodvb
parents: 20344
diff changeset
1144 spriv->pack_offset = 0;
33cce0f7e66c permit muxing to raw pes (VDR uses this)
nicodvb
parents: 20344
diff changeset
1145 else
18192
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1146 spriv->pack_offset = 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
1147 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
1148 {
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1149 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
1150 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
1151 }
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
1152
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
1153 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
1154 {
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
1155 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
1156 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
1157 }
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
1158
18192
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1159 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
1160 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
1161 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
1162 spriv->frames = 0;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1163 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
1164 }
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1165
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1166 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
1167 {
21413
06d63614eeaa permit to specify the sizes of the decoders' buffers
nicodvb
parents: 21372
diff changeset
1168 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
1169 //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
1170 //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
1171 //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
1172 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
1173 {
06d63614eeaa permit to specify the sizes of the decoders' buffers
nicodvb
parents: 21372
diff changeset
1174 if(s->type == MUXER_TYPE_VIDEO)
06d63614eeaa permit to specify the sizes of the decoders' buffers
nicodvb
parents: 21372
diff changeset
1175 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
1176 else
06d63614eeaa permit to specify the sizes of the decoders' buffers
nicodvb
parents: 21372
diff changeset
1177 bufsize = (conf_abuf_size ? conf_abuf_size : 4);
06d63614eeaa permit to specify the sizes of the decoders' buffers
nicodvb
parents: 21372
diff changeset
1178 spriv->buffer_size = bufsize*1024;
06d63614eeaa permit to specify the sizes of the decoders' buffers
nicodvb
parents: 21372
diff changeset
1179 }
18192
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1180
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1181 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
1182 && 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
1183 dvd_pack = 1;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1184
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
1185 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
1186 {
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1187 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
1188 return 0;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1189 }
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
1190 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
1191 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
1192 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
1193 spriv->last_saved_pts = p.pts;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1194
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1195 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
1196 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
1197
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1198 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
1199 {
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1200 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
1201 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
1202 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
1203 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
1204 else
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1205 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
1206 }
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1207
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1208 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
1209 }
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1210
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1211
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1212 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
1213 {
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1214 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
1215 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
1216 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
1217 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
1218 }
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1219
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1220 n = 0;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1221 len = 0;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1222
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1223 frm = spriv->framebuf;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1224 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
1225 {
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1226 if(!frm->pos)
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1227 {
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1228 //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
1229 //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
1230 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
1231 {
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1232 break;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1233 }
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1234 spriv->frames++;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1235 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
1236 }
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1237
21531
a90aa203186c Get rid of min/max macros from aviheader.h, they do not belong here.
reimar
parents: 21486
diff changeset
1238 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
1239 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
1240
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1241 len += m;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1242 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
1243 frm->pos += m;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1244
18192
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1245 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
1246 {
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1247 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
1248 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
1249 n++;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1250 frm++;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1251 }
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1252 }
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1253
21141
33cce0f7e66c permit muxing to raw pes (VDR uses this)
nicodvb
parents: 20344
diff changeset
1254 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
1255 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
1256
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1257 spriv->size += len;
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 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
1260 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
1261
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1262 if(n > 0)
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1263 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
1264
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1265 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
1266 if(spriv->track_bufsize > spriv->max_buffer_size)
23637
df9aa9eb9de6 Use proper PRI?64 format strings
reimar
parents: 22929
diff changeset
1267 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
1268
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1269 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
1270 fix_a52_headers(s);
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1271
21141
33cce0f7e66c permit muxing to raw pes (VDR uses this)
nicodvb
parents: 20344
diff changeset
1272 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
1273 {
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1274 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
1275 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
1276 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
1277 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1278
21660
ca9da45d13e9 muxers now write to output muxer->stream rather than to muxer->file
nicodvb
parents: 21544
diff changeset
1279 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
1280
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1281 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
1282 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
1283 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
1284
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1285 spriv->pack_offset = 0;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1286 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
1287 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
1288 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
1289 priv->last_psm_scr = priv->scr;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1290
18192
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1291 return len;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1292 }
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1293
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1294 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
1295 {
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1296 int i, ndts;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1297 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
1298 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
1299 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
1300 pack_stats_t p;
22929
a60dbae6ee1d added :interleaving2, a better method to determine which stream whouls be flushed
nicodvb
parents: 22927
diff changeset
1301 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
1302
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1303 ndts = -1;
22929
a60dbae6ee1d added :interleaving2, a better method to determine which stream whouls be flushed
nicodvb
parents: 22927
diff changeset
1304 perc = -1;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1305
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
1306 //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
1307 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
1308 {
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1309 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
1310
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
1311 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
1312 get_packet_stats(priv, muxer->streams[i], &p, 0);
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1313
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
1314 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
1315 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
1316 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
1317 continue;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1318
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1319 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
1320 {
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1321 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
1322 ndts = i;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1323 }
22929
a60dbae6ee1d added :interleaving2, a better method to determine which stream whouls be flushed
nicodvb
parents: 22927
diff changeset
1324
a60dbae6ee1d added :interleaving2, a better method to determine which stream whouls be flushed
nicodvb
parents: 22927
diff changeset
1325 if(conf_interleaving2)
a60dbae6ee1d added :interleaving2, a better method to determine which stream whouls be flushed
nicodvb
parents: 22927
diff changeset
1326 {
a60dbae6ee1d added :interleaving2, a better method to determine which stream whouls be flushed
nicodvb
parents: 22927
diff changeset
1327 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
1328 if(sperc < perc)
a60dbae6ee1d added :interleaving2, a better method to determine which stream whouls be flushed
nicodvb
parents: 22927
diff changeset
1329 {
a60dbae6ee1d added :interleaving2, a better method to determine which stream whouls be flushed
nicodvb
parents: 22927
diff changeset
1330 ndts = i;
a60dbae6ee1d added :interleaving2, a better method to determine which stream whouls be flushed
nicodvb
parents: 22927
diff changeset
1331 perc = sperc;
a60dbae6ee1d added :interleaving2, a better method to determine which stream whouls be flushed
nicodvb
parents: 22927
diff changeset
1332 }
a60dbae6ee1d added :interleaving2, a better method to determine which stream whouls be flushed
nicodvb
parents: 22927
diff changeset
1333 }
18192
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1334 }
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1335
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1336 return ndts;
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1337 }
0b77e66a7d32 introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents: 18187
diff changeset
1338
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1339 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
1340 {
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1341 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
1342 {
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1343 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
1344 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
1345 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
1346 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1347
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1348 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
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[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
1351 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
1352 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
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->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
1356 buf[7] = (buf[7] & 0x0f) | (priv->vaspect << 4);
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1357
14753
70c446099f40 new mpeg 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 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
1359 buf[7] = (buf[7] & 0xf0) | priv->vframerate;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1360
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1361 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
1362 {
70c446099f40 new mpeg 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[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
1364 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
1365 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
1366 }
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1367 }
70c446099f40 new mpeg 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
70c446099f40 new mpeg 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 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
1370 { //patches sequence display extension (display_horizontal_size and display_vertical_size)
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1371 //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
1372 int offset = 1;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1373
14753
70c446099f40 new mpeg 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 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
1375 offset += 3;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1376
14753
70c446099f40 new mpeg 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 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
1378 {
70c446099f40 new mpeg 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 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
1380 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
1381 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1382
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1383 offset++;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1384
14753
70c446099f40 new mpeg 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 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
1386 {
70c446099f40 new mpeg 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] = (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
1388 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
1389 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
1390 }
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1391 }
70c446099f40 new mpeg 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
70c446099f40 new mpeg 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
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
1394 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
1395 {
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
1396 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
1397 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
1398 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
1399 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
1400 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
1401
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
1402 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
1403
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 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
1405 {
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
1406 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
1407 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
1408 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
1409 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
1410 }
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1411
32352
76f94c00a69f 1000l, %lf is not valid format string for printf (only for scanf) and actually
reimar
parents: 31864
diff changeset
1412 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
1413
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
1414 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
1415 {
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
1416 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
1417 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
1418
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
1419 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
1420 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
1421 {
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
1422 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
1423 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
1424 }
18196
f7f6984638f8 finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents: 18192
diff changeset
1425 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
1426 {
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
1427 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
1428 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
1429 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
1430 priv->delta_scr = (uint64_t) (d * 27000000.0f);
33792
6d00f9ad294c Fix typo.
cehoyos
parents: 32618
diff changeset
1431 mp_msg(MSGT_MUXER, MSGL_INFO, "\r\nBUFFER UNDERFLOW 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
1432 spriv->track_bufsize = 0;
21448
24775c741a9a cosmetics: anti-chaos reindentation
nicodvb
parents: 21413
diff changeset
1433 }
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
1434
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
1435 if(j > 0)
21448
24775c741a9a cosmetics: anti-chaos reindentation
nicodvb
parents: 21413
diff changeset
1436 {
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
1437 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
1438 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
1439 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
1440 spriv->buffer_track[j].size = 0;
21448
24775c741a9a cosmetics: anti-chaos reindentation
nicodvb
parents: 21413
diff changeset
1441 }
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1442
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
1443 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
1444 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
1445 }
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1446 }
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1447
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1448
70c446099f40 new mpeg 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 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
1450 {
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1451 int n, found = 0;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
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 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
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 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
1456 //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
1457 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
1458 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
1459 {
32352
76f94c00a69f 1000l, %lf is not valid format string for printf (only for scanf) and actually
reimar
parents: 31864
diff changeset
1460 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
1461 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
1462 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
1463
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1464 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
1465 {
70c446099f40 new mpeg 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 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
1467 {
70c446099f40 new mpeg 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 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
1469 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
1470 }
70c446099f40 new mpeg 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 }
70c446099f40 new mpeg 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 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
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 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1476
14753
70c446099f40 new mpeg 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 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
1478 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
1479 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
1480 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
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
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1483 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
1484 {
18199
10eaea5b657d removed unused variables
nicodvb
parents: 18197
diff changeset
1485 int i, n, found;
10eaea5b657d removed unused variables
nicodvb
parents: 18197
diff changeset
1486 int skip_cnt;
10eaea5b657d removed unused variables
nicodvb
parents: 18197
diff changeset
1487 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
1488 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
1489 muxer_headers_t *vpriv = NULL, *apriv = NULL;
35314
eaace9a7e822 Simplify: remove useless casts, NULL checks etc.
reimar
parents: 35236
diff changeset
1490 muxer_priv_t *priv = 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
1491 uint64_t iduration, iaduration;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1492
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1493 /*
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1494 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
1495 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
1496 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
1497 */
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1498 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
1499 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
1500 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
1501 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
1502 {
70c446099f40 new mpeg 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 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
1504 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
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 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
1507 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
1508 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
1509 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
1510 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
1511 }
70c446099f40 new mpeg 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 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
1513 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
1514 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1515
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1516 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
1517 {
70c446099f40 new mpeg 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 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
1519 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
1520 }
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1521
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1522 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
1523 {
15278
a45c7e1b998f added support for AAC; moved most of MSGL_V to MSGL_DBG2 to reduce verbosity
nicodvb
parents: 15083
diff changeset
1524 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
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 vpriv = (muxer_headers_t*) vs->priv;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1527
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
1528 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
1529 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
1530 iduration += vpriv->framebuf[i].idur;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1531
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
1532 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
1533 {
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
1534 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
1535 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
1536 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
1537 {
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 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
1539 }
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 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
1541 {
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 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
1543 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
1544 }
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 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1546
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
1547 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
1548 {
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
1549 init_delay = vpriv->framebuf[0].pts - vpriv->framebuf[0].dts;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1550
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
1551 for(i = 0; i < apriv->framebuf_cnt; i++)
21448
24775c741a9a cosmetics: anti-chaos reindentation
nicodvb
parents: 21413
diff changeset
1552 {
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
1553 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
1554 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
1555 }
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
1556 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
1557 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
1558 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1559
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1560 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
1561 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
1562
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1563 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
1564 skip_cnt = 0;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1565
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
1566 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
1567 {
f7f6984638f8 finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents: 18192
diff changeset
1568 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
1569 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
1570 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
1571 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
1572 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
1573 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
1574
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
1575 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
1576 {
5ccb2b837b1c if no stream could be muxed flush_buffers() returns 0: prevents while(1) stall at the end
nicodvb
parents: 20153
diff changeset
1577 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
1578 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
1579 }
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1580 }
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
1581 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1582
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1583 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
1584 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
1585 }
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1586
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1587
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
1588 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
1589 {
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
1590 // 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
1591 int d = (int)(fps*1001+0.5);
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1592
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
1593 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
1594 }
70c446099f40 new mpeg 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
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
1596
21467
dd765bcd83aa added generalized teleciner by Donald Graft
nicodvb
parents: 21448
diff changeset
1597 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
1598 {
17814
8f2e94a4a4c1 check pce_ptr before using it; fixes cid 207
nicodvb
parents: 17603
diff changeset
1599 if(! pce_ptr)
8f2e94a4a4c1 check pce_ptr before using it; fixes cid 207
nicodvb
parents: 17603
diff changeset
1600 return 0;
14840
d49482c5d8ac soft telecine support! :)) patch by nico
rfelker
parents: 14809
diff changeset
1601 if(fps_ptr != NULL)
d49482c5d8ac soft telecine support! :)) patch by nico
rfelker
parents: 14809
diff changeset
1602 {
21484
af37e86b635f cosmetics
nicodvb
parents: 21483
diff changeset
1603 *fps_ptr = (*fps_ptr & 0xf0) | priv->vframerate;
af37e86b635f cosmetics
nicodvb
parents: 21483
diff changeset
1604 vpriv->nom_delta_pts = parse_fps(conf_vframerate);
14840
d49482c5d8ac soft telecine support! :)) patch by nico
rfelker
parents: 14809
diff changeset
1605 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1606
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1607 //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
1608 if(pce_ptr[3] & 0x2)
d49482c5d8ac soft telecine support! :)) patch by nico
rfelker
parents: 14809
diff changeset
1609 {
d49482c5d8ac soft telecine support! :)) patch by nico
rfelker
parents: 14809
diff changeset
1610 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
1611 vpriv->telecine = 0;
d49482c5d8ac soft telecine support! :)) patch by nico
rfelker
parents: 14809
diff changeset
1612 return 0;
d49482c5d8ac soft telecine support! :)) patch by nico
rfelker
parents: 14809
diff changeset
1613 }
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
1614
14894
bd6d709d13fb recalculate frame duration after soft telecine
nicodvb
parents: 14881
diff changeset
1615 vpriv->picture.progressive_sequence = 0;
bd6d709d13fb recalculate frame duration after soft telecine
nicodvb
parents: 14881
diff changeset
1616 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
1617 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
1618 se_ptr[1] &= 0xf7;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1619
24630
dcba95743b2f 1000l, the tff flag was never cleared before being overwritten with the value on bff_mask;
nicodvb
parents: 23637
diff changeset
1620 //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
1621 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
1622 pce_ptr[4] |= 0x80; //sets progressive frame
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1623
21467
dd765bcd83aa added generalized teleciner by Donald Graft
nicodvb
parents: 21448
diff changeset
1624 vpriv->display_frame += n;
14840
d49482c5d8ac soft telecine support! :)) patch by nico
rfelker
parents: 14809
diff changeset
1625 if(! vpriv->vframes)
21483
e065bb0c5485 removed dead code
nicodvb
parents: 21482
diff changeset
1626 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
1627
14840
d49482c5d8ac soft telecine support! :)) patch by nico
rfelker
parents: 14809
diff changeset
1628 return 1;
d49482c5d8ac soft telecine support! :)) patch by nico
rfelker
parents: 14809
diff changeset
1629 }
d49482c5d8ac soft telecine support! :)) patch by nico
rfelker
parents: 14809
diff changeset
1630
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1631 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
1632 {
14840
d49482c5d8ac soft telecine support! :)) patch by nico
rfelker
parents: 14809
diff changeset
1633 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
1634 uint8_t *se_ptr = NULL; //pointer to sequence extension
d49482c5d8ac soft telecine support! :)) patch by nico
rfelker
parents: 14809
diff changeset
1635 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
1636 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
1637 int ret;
22330
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1638 int i, err;
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1639 uint32_t temp_ref;
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1640 int pt;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1641
15278
a45c7e1b998f added support for AAC; moved most of MSGL_V to MSGL_DBG2 to reduce verbosity
nicodvb
parents: 15083
diff changeset
1642 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
1643 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
1644 {
33841
25667edae85c cleanup: adjust printf format strings to match parameter types
diego
parents: 33792
diff changeset
1645 mp_msg(MSGT_MUXER, MSGL_ERR,"Unknown video format, possibly non-MPEG1/2 stream, len=%zu!\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
1646 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
1647 }
22330
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1648
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1649 temp_ref = 0;
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1650 pt = 0;
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1651 err = 0;
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1652 i = 0;
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1653 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
1654 { // Video (0) Sequence header (b3) or GOP (b8)
22330
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1655 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
1656 {
22330
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1657 switch(s->buffer[i+3])
14840
d49482c5d8ac soft telecine support! :)) patch by nico
rfelker
parents: 14809
diff changeset
1658 {
22330
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1659 case 0xb3: //sequence
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1660 {
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1661 if(i + 11 > len)
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1662 {
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1663 err=1;
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1664 break;
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1665 }
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1666 fps_ptr = &(s->buffer[i+7]);
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1667 mp_header_process_sequence_header(&(spriv->picture), &(s->buffer[i+4]));
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1668 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
1669
22330
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1670 spriv->delta_clock = (double) 1/fps;
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1671 //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
1672 if(! spriv->delta_pts)
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1673 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
1674 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
1675 if(priv->patch_seq)
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1676 patch_seq(priv, &(s->buffer[i]));
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1677 }
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1678 break;
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1679
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1680 case 0xb5:
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1681 if(i + 9 > len)
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1682 {
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1683 err = 1;
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1684 break;
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1685 }
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1686 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
1687 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
1688 se_ptr = &(s->buffer[i+4]);
22330
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1689 if(((s->buffer[i+4] & 0xf0) == 0x20))
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1690 {
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1691 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
1692 patch_panscan(priv, &(s->buffer[i+4]));
22330
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1693 }
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1694 if((s->buffer[i+4] & 0xf0) == 0x80)
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1695 {
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1696 pce_ptr = &(s->buffer[i+4]);
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1697 }
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1698 break;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1699
22330
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1700 case 0xb8:
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1701 gop_reset = 1;
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1702 break;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1703
22330
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1704 case 0x00:
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1705 if(i + 5 > len)
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1706 {
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1707 err = 1;
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1708 break;
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1709 }
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1710 pt = (s->buffer[i+5] & 0x1c) >> 3;
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1711 temp_ref = (s->buffer[i+4]<<2)+(s->buffer[i+5]>>6);
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1712 break;
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1713 }
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1714 if(err) break; //something went wrong
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1715 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
1716 }
22330
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1717 i++;
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1718 }
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1719 if(err)
3e9ffa27ca7f simplified parse_mpeg12_video()
nicodvb
parents: 22328
diff changeset
1720 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
1721
22332
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1722 //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
1723 if(!spriv->nom_delta_pts)
22332
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1724 spriv->delta_pts = spriv->nom_delta_pts = parse_fps(fps);
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1725 if(!spriv->vframes)
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1726 spriv->last_tr = spriv->max_tr = temp_ref;
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1727 d1 = temp_ref - spriv->last_tr;
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1728 if(gop_reset)
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1729 frames_diff = spriv->max_tr + 1 + temp_ref - spriv->last_tr;
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1730 else
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1731 {
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1732 if(d1 < -6) //there's a wraparound
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1733 frames_diff = spriv->max_tr + 1 + temp_ref - spriv->last_tr;
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1734 else if(d1 > 6) //there's a wraparound
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1735 frames_diff = spriv->max_tr + 1 + spriv->last_tr - temp_ref;
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1736 else if(!d1) //pre-emptive fix against broken sequences
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1737 frames_diff = 1;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1738 else
22332
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1739 frames_diff = d1;
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1740 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1741 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
1742 spriv->last_tr, temp_ref, gop_reset, frames_diff, spriv->max_tr, d1);
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1743
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1744 if(temp_ref > spriv->max_tr || gop_reset)
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1745 spriv->max_tr = temp_ref;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1746
22332
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1747 spriv->last_tr = temp_ref;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1748 if(spriv->picture.mpeg1 == 0)
22332
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1749 {
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1750 if(spriv->telecine && pce_ptr)
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1751 {
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1752 soft_telecine(priv, spriv, fps_ptr, se_ptr, pce_ptr, frames_diff);
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1753 spriv->picture.display_time = 100;
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1754 mp_header_process_extension(&(spriv->picture), pce_ptr);
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1755 if(spriv->picture.display_time >= 50 && spriv->picture.display_time <= 300)
22332
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1756 spriv->delta_pts = (spriv->nom_delta_pts * spriv->picture.display_time) / 100;
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1757 }
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1758 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1759
22332
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1760 if(! spriv->vframes)
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1761 frames_diff = 1;
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1762
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1763 spriv->last_dts += spriv->delta_pts;
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1764 spriv->last_pts += spriv->nom_delta_pts*(frames_diff-1) + spriv->delta_pts;
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1765
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1766 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
1767 if(ret < 0)
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1768 {
33841
25667edae85c cleanup: adjust printf format strings to match parameter types
diego
parents: 33792
diff changeset
1769 mp_msg(MSGT_MUXER, MSGL_FATAL, "\r\nPARSE_MPEG12: add_frames(%zu) failed, exit\r\n", len);
22332
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1770 return 0;
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1771 }
35234
7663c4370ebe Fix format string typo.
reimar
parents: 34279
diff changeset
1772 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
1773 ftypes[pt], temp_ref, frames_diff, ((double) spriv->last_dts/27000000.0f),
22332
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1774 ((double) spriv->last_pts/27000000.0f), spriv->picture.display_time, gop_reset);
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1775
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1776 if(pt == B_FRAME)
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1777 {
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1778 int j, n, adj = 0;
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1779 int64_t diff = spriv->last_dts - spriv->last_pts;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1780
22332
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1781 if(diff != 0)
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1782 {
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1783 n = spriv->framebuf_used - 1;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1784
22332
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1785 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
1786 {
22332
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1787 if(spriv->framebuf[j].pts >= spriv->last_pts)
14894
bd6d709d13fb recalculate frame duration after soft telecine
nicodvb
parents: 14881
diff changeset
1788 {
22332
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1789 spriv->framebuf[j].pts += diff;
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1790 adj++;
14894
bd6d709d13fb recalculate frame duration after soft telecine
nicodvb
parents: 14881
diff changeset
1791 }
bd6d709d13fb recalculate frame duration after soft telecine
nicodvb
parents: 14881
diff changeset
1792 }
32352
76f94c00a69f 1000l, %lf is not valid format string for printf (only for scanf) and actually
reimar
parents: 31864
diff changeset
1793 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
1794 n, diff, (double) diff/27000000.0f, (double) spriv->last_pts/27000000.0f);
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1795 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
1796 }
22332
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1797 }
19bb3ee5cca2 cosmetics: reformatted
nicodvb
parents: 22331
diff changeset
1798 spriv->vframes++;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1799
15278
a45c7e1b998f added support for AAC; moved most of MSGL_V to MSGL_DBG2 to reduce verbosity
nicodvb
parents: 15083
diff changeset
1800 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
1801 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
1802 }
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1803
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1804
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1805 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
1806 {
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1807 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
1808 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
1809
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1810 mn = mx = vpriv->framebuf[0].pts;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1811 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
1812 {
16750
0a31740dd5e6 Use PRI?64 defines as format strings for 64 bit variables.
reimar
parents: 16192
diff changeset
1813 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
1814 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
1815 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
1816 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
1817 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
1818 }
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1819 md = mn;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1820 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
1821 {
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1822 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
1823 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
1824 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1825
14753
70c446099f40 new mpeg 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(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
1827 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
1828 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
1829 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
1830
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
1831 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
1832 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
1833 {
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1834 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
1835 {
70c446099f40 new mpeg 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 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
1837 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
1838 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
1839 (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
1840 }
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1841 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
1842 }
70c446099f40 new mpeg 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 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
1844 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
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
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1847
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1848 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
1849 {
70c446099f40 new mpeg 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 size_t ptr = 0;
17815
36a155ee4d27 init delta_pts before using it; fixes cid 239
nicodvb
parents: 17814
diff changeset
1851 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
1852 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
1853 int ret;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1854
15278
a45c7e1b998f added support for AAC; moved most of MSGL_V to MSGL_DBG2 to reduce verbosity
nicodvb
parents: 15083
diff changeset
1855 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
1856 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
1857 {
33841
25667edae85c cleanup: adjust printf format strings to match parameter types
diego
parents: 33792
diff changeset
1858 mp_msg(MSGT_MUXER, MSGL_ERR,"Frame too short: %zu, 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
1859 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
1860 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1861
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
1862 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
1863 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
1864 {
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1865 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
1866 {
70c446099f40 new mpeg 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 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
1868 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
1869 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1870
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1871 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
1872 {
70c446099f40 new mpeg 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 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
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 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
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 //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
1878 }
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1879 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
1880 {
70c446099f40 new mpeg 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 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
1882 mp4_header_process_vop(&(vpriv->picture), &(s->buffer[ptr+4]));
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1883
14753
70c446099f40 new mpeg 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 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
1885 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
1886 delta -= vpriv->picture.timeinc_resolution;
18163
1e4caa08161d fixed wrong operator precedence in parse_mpeg4_video()
nicodvb
parents: 18162
diff changeset
1887 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
1888 delta += vpriv->picture.timeinc_resolution;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1889
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
1890 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
1891 //warning, it seems that packed bops can lead to delta == 0
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1892
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1893 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
1894 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
1895 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
1896 (double) delta / (double) vpriv->picture.timeinc_resolution);
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1897
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1898 vpriv->last_tr = vpriv->picture.timeinc_unit;
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1899
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1900 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
1901 }
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 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
1904 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1905
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
1906 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
1907 {
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
1908 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
1909 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
1910 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1911
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
1912 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
1913 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
1914 {
33841
25667edae85c cleanup: adjust printf format strings to match parameter types
diego
parents: 33792
diff changeset
1915 mp_msg(MSGT_MUXER, MSGL_FATAL, "\r\nPARSE_MPEG4: add_frames(%zu) 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
1916 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
1917 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1918
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1919 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
1920 {
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1921 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
1922 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
1923 {
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1924 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
1925 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
1926 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
1927 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
1928 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
1929 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
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 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1932
32352
76f94c00a69f 1000l, %lf is not valid format string for printf (only for scanf) and actually
reimar
parents: 31864
diff changeset
1933 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
1934 (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
1935
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
1936 vpriv->vframes++;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1937
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
1938 return len;
8585
27da710563c2 the long-waited MUXER layer, and new MPEG-PS muxer
arpi
parents:
diff changeset
1939 }
27da710563c2 the long-waited MUXER layer, and new MPEG-PS muxer
arpi
parents:
diff changeset
1940
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
1941
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
1942 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
1943 {
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
1944 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
1945
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
1946 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
1947 return 0;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1948
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
1949 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
1950 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
1951 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
1952 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
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 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
1955 {
18558
4928dd61f136 Fix potential integer overflows in memory allocation.
rtogni
parents: 18249
diff changeset
1956 if(spriv->framebuf[idx].size > SIZE_MAX - (size_t)len)
4928dd61f136 Fix potential integer overflows in memory allocation.
rtogni
parents: 18249
diff changeset
1957 return 0;
30702
9fc9d1e788aa Do not cast the results of malloc/calloc/realloc.
diego
parents: 30633
diff changeset
1958 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
1959 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
1960 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
1961 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
1962 }
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 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
1965 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
1966
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
1967 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
1968 }
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
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
1970 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
1971 {
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
1972 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
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 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
1975 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
1976 {
30702
9fc9d1e788aa Do not cast the results of malloc/calloc/realloc.
diego
parents: 30633
diff changeset
1977 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
1978 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
1979 {
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
1980 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
1981 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
1982 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1983
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
1984 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
1985 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
1986 spriv->framebuf[spriv->framebuf_cnt].pos = 0;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1987
30702
9fc9d1e788aa Do not cast the results of malloc/calloc/realloc.
diego
parents: 30633
diff changeset
1988 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
1989 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
1990 {
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
1991 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
1992 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
1993 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1994 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
1995 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
1996 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
1997
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
1998 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
1999 {
18558
4928dd61f136 Fix potential integer overflows in memory allocation.
rtogni
parents: 18249
diff changeset
2000 if(spriv->framebuf[idx].size > SIZE_MAX - (size_t)len)
4928dd61f136 Fix potential integer overflows in memory allocation.
rtogni
parents: 18249
diff changeset
2001 {
4928dd61f136 Fix potential integer overflows in memory allocation.
rtogni
parents: 18249
diff changeset
2002 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
2003 return -1;
4928dd61f136 Fix potential integer overflows in memory allocation.
rtogni
parents: 18249
diff changeset
2004 }
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[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
2006 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
2007 {
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 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
2009 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
2010 }
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
2011 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
2012 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
2013
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
2014 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
2015 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 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
2017 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
2018
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
2019 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
2020 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
2021 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
2022 spriv->framebuf_used++;
23637
df9aa9eb9de6 Use proper PRI?64 format strings
reimar
parents: 22929
diff changeset
2023 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
2024
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
2025 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
2026 }
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
2027
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
2028 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
2029 {
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
2030 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
2031 int score[4] = {0, 0, 0, 0};
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
2032
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
2033 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
2034 {
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
2035 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
2036 {
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
2037 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
2038 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
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 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
2041 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
2042 }
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 }
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 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
2045 }
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 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
2048 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
2049 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
2050 {
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 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
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 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
2054 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
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
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 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
2059 }
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
2060
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
2061 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
2062 {
31799
fe2e3c755706 Use mp_a52_framesize() in all cases; gets rid of liba52 dependency.
diego
parents: 31798
diff changeset
2063 int i, j, len, chans, srate, spf, layer, tot, num, frm_idx;
18238
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2064 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
2065 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
2066 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
2067 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
2068 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
2069
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 i = tot = frames = 0;
18238
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2071 finished = 0;
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2072 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
2073 {
18238
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2074 len = 0;
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2075 switch(s->wf->wFormatTag)
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2076 {
32618
de37221dff02 Support 0xff as tag for AAC audio and avoid an endless loop for unknown
reimar
parents: 32537
diff changeset
2077 default:
de37221dff02 Support 0xff as tag for AAC audio and avoid an endless loop for unknown
reimar
parents: 32537
diff changeset
2078 mp_msg(MSGT_MUXER, MSGL_ERR, "Unknown audio format, assuming MP2/3, use -fafmttag!\n");
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
2079 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
2080 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
2081 {
18238
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2082 if(i + 3 >= s->b_buffer_len)
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2083 {
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2084 finished = 1;
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2085 break;
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2086 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
2087
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
2088 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
2089 {
16162
b5c2254d13f8 set i_bps in demux_audio for WAV and MP3 to avoid division by zero before
reimar
parents: 15947
diff changeset
2090 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
2091 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
2092 && 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
2093 {
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
2094 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
2095 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
2096 }
18238
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2097 else
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2098 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
2099 }
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
2100 }
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 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
2102
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
2103 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
2104 {
18238
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2105 if(i + 6 >= s->b_buffer_len)
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2106 {
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2107 finished = 1;
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2108 break;
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2109 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
2110
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
2111 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
2112 {
17493
f71e678e6216 use mp_a52_framesize() when liba52 is not available
nicodvb
parents: 17487
diff changeset
2113 srate = 0;
f71e678e6216 use mp_a52_framesize() when liba52 is not available
nicodvb
parents: 17487
diff changeset
2114 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
2115 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
2116 {
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
2117 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
2118 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
2119 }
18238
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2120 else
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2121 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
2122 }
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 }
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 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
2125
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
2126 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
2127 case AUDIO_AAC2:
32618
de37221dff02 Support 0xff as tag for AAC audio and avoid an endless loop for unknown
reimar
parents: 32537
diff changeset
2128 case AUDIO_AAC3:
15947
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
2129 {
18238
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2130 if(i + 7 >= s->b_buffer_len)
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2131 {
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2132 finished = 1;
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2133 break;
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2134 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
2135
15947
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
2136 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
2137 {
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
2138 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
2139 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
2140 {
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
2141 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
2142 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
2143 }
18238
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2144 else
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2145 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
2146 }
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 }
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
2148 }
18238
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2149
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2150 if(finished)
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2151 break;
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2152
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2153 if(!len)
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2154 {
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2155 i++;
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2156 continue;
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2157 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
2158
18238
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2159 spriv->timer += dur;
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2160 if(spriv->drop_delayed_frames && delay < 0 && spriv->timer <= -delay)
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2161 {
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2162 i += len;
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2163 tot = i;
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2164 continue;
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2165 }
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2166
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2167 frames++;
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2168 fill_last_frame(spriv, &(s->b_buffer[tot]), i - tot);
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2169 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
2170 if(frm_idx < 0)
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2171 {
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2172 mp_msg(MSGT_MUXER, MSGL_FATAL, "Couldn't add audio frame buffer(frame), abort\n");
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2173 goto audio_exit;
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2174 }
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2175 for(j = frm_idx; j < spriv->framebuf_cnt; j++)
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2176 spriv->framebuf[j].pts = spriv->last_pts;
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2177 spriv->last_pts += idur;
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2178
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2179 i += len;
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2180 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
2181 }
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
2182
18238
01b1d174ec73 simplified parse_audio()
nicodvb
parents: 18200
diff changeset
2183 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
2184 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
2185 {
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
2186 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
2187 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
2188 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
2189 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
2190 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
2191 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
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
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 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
2195 {
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
2196 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
2197 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
2198 {
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
2199 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
2200 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
2201 }
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 }
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
2203
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
2204 *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
2205 *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
2206
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
2207 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
2208 }
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
2209
18183
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
2210 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
2211 {
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
2212 muxer_headers_t *spriv = stream->priv;
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
2213 muxer_t *muxer = stream->muxer;
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
2214 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
2215 uint32_t stream_format;
24909
55c96e871198 10l, priv->use_psm can be 1 only if the format is genmpeg2
nicodvb
parents: 24908
diff changeset
2216 int needs_psm = 0;
18183
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
2217
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
2218 if(stream->type == MUXER_TYPE_AUDIO)
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
2219 {
24905
170dcb44069a moved to fix_parameters() the code that decides if the PSM is needed
nicodvb
parents: 24904
diff changeset
2220 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
2221 spriv->is_ready = 1;
21413
06d63614eeaa permit to specify the sizes of the decoders' buffers
nicodvb
parents: 21372
diff changeset
2222 if(conf_abuf_size)
06d63614eeaa permit to specify the sizes of the decoders' buffers
nicodvb
parents: 21372
diff changeset
2223 spriv->max_buffer_size = conf_abuf_size*1024;
06d63614eeaa permit to specify the sizes of the decoders' buffers
nicodvb
parents: 21372
diff changeset
2224 else
18183
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
2225 spriv->max_buffer_size = 4*1024;
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
2226 if(stream->wf->wFormatTag == AUDIO_A52)
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
2227 {
31623
4d4ed6c9039c Fix some remaining bswap-related compilation issues.
reimar
parents: 31618
diff changeset
2228 stream->ckid = av_be2ne32(0x1bd);
18183
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
2229 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
2230 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
2231 spriv->id = 0xbd;
21413
06d63614eeaa permit to specify the sizes of the decoders' buffers
nicodvb
parents: 21372
diff changeset
2232 if(!conf_abuf_size)
18183
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
2233 spriv->max_buffer_size = 16*1024;
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
2234 }
32618
de37221dff02 Support 0xff as tag for AAC audio and avoid an endless loop for unknown
reimar
parents: 32537
diff changeset
2235 else if(stream->wf->wFormatTag == AUDIO_AAC1 || stream->wf->wFormatTag == AUDIO_AAC2 ||
de37221dff02 Support 0xff as tag for AAC audio and avoid an endless loop for unknown
reimar
parents: 32537
diff changeset
2236 stream->wf->wFormatTag == AUDIO_AAC3)
24909
55c96e871198 10l, priv->use_psm can be 1 only if the format is genmpeg2
nicodvb
parents: 24908
diff changeset
2237 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
2238 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
2239 spriv->is_ready = 0;
18183
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
2240 }
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
2241 else //video
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
2242 {
24905
170dcb44069a moved to fix_parameters() the code that decides if the PSM is needed
nicodvb
parents: 24904
diff changeset
2243 stream_format = stream->bih->biCompression;
21413
06d63614eeaa permit to specify the sizes of the decoders' buffers
nicodvb
parents: 21372
diff changeset
2244 if(conf_vbuf_size)
06d63614eeaa permit to specify the sizes of the decoders' buffers
nicodvb
parents: 21372
diff changeset
2245 spriv->max_buffer_size = conf_vbuf_size*1024;
06d63614eeaa permit to specify the sizes of the decoders' buffers
nicodvb
parents: 21372
diff changeset
2246 else
06d63614eeaa permit to specify the sizes of the decoders' buffers
nicodvb
parents: 21372
diff changeset
2247 {
24902
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2248 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
2249 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
2250 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
2251 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
2252 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
2253 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
2254 else
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; //no profile => unconstrained :) FIXME!!!
21413
06d63614eeaa permit to specify the sizes of the decoders' buffers
nicodvb
parents: 21372
diff changeset
2256 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
2257
18183
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
2258 if(is_mpeg4(stream->bih->biCompression))
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
2259 spriv->is_ready = 0;
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
2260 else
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
2261 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
2262
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
2263 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
2264 needs_psm = 1;
18183
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
2265 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
2266
24909
55c96e871198 10l, priv->use_psm can be 1 only if the format is genmpeg2
nicodvb
parents: 24908
diff changeset
2267 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
2268 {
24909
55c96e871198 10l, priv->use_psm can be 1 only if the format is genmpeg2
nicodvb
parents: 24908
diff changeset
2269 priv->use_psm = 1;
24905
170dcb44069a moved to fix_parameters() the code that decides if the PSM is needed
nicodvb
parents: 24904
diff changeset
2270 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
2271 priv->psm_streams_cnt++;
170dcb44069a moved to fix_parameters() the code that decides if the PSM is needed
nicodvb
parents: 24904
diff changeset
2272 }
18183
ac03acb92d24 introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents: 18181
diff changeset
2273 }
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
2274
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
2275
24902
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2276 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
2277 {
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2278 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
2279 uint64_t tmp;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2280 muxer_t *muxer = s->muxer;
35314
eaace9a7e822 Simplify: remove useless casts, NULL checks etc.
reimar
parents: 35236
diff changeset
2281 muxer_priv_t *priv = muxer->priv;
eaace9a7e822 Simplify: remove useless casts, NULL checks etc.
reimar
parents: 35236
diff changeset
2282 muxer_headers_t *spriv = s->priv;
24902
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2283 float fps;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2284 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
2285
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2286 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
2287 return;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2288
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2289 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
2290 { // 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
2291 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
2292 spriv->type = 1;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2293 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
2294 if(! spriv->vframes)
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2295 {
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2296 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
2297 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
2298 }
21448
24775c741a9a cosmetics: anti-chaos reindentation
nicodvb
parents: 21413
diff changeset
2299
24902
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2300 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
2301 {
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2302 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
2303 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
2304 if(len)
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2305 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
2306 else
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 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
2309 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
2310 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
2311 }
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2312 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
2313 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
2314 {
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2315 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
2316 spriv->telecine = 0;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2317 if(len)
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2318 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
2319 else
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 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
2322 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
2323 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
2324 }
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2325 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
2326
24902
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2327 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
2328 }
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2329 else
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2330 { // MUXER_TYPE_AUDIO
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2331 double fake_timer;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2332 spriv->type = 0;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2333 stream_format = s->wf->wFormatTag;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
2334
24902
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2335 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
2336 {
24910
74ae00838094 prevent unlikely memleak
nicodvb
parents: 24909
diff changeset
2337 void *tmp;
74ae00838094 prevent unlikely memleak
nicodvb
parents: 24909
diff changeset
2338
24902
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2339 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
2340 {
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2341 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
2342 return;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2343 }
24910
74ae00838094 prevent unlikely memleak
nicodvb
parents: 24909
diff changeset
2344 tmp = realloc(s->b_buffer, len + s->b_buffer_len);
74ae00838094 prevent unlikely memleak
nicodvb
parents: 24909
diff changeset
2345 if(!tmp)
24902
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2346 {
33841
25667edae85c cleanup: adjust printf format strings to match parameter types
diego
parents: 33792
diff changeset
2347 mp_msg(MSGT_MUXER, MSGL_FATAL, "\nFATAL! couldn't realloc %zu 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
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 s->b_buffer = tmp;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
2351
24902
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2352 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
2353 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
2354 }
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2355 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
2356 s->b_buffer_len += len;
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 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
2359 {
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2360 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
2361 {
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2362 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
2363 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
2364 }
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 else
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 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
2369 spriv->vframes += nf;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2370 if(! spriv->vframes)
32352
76f94c00a69f 1000l, %lf is not valid format string for printf (only for scanf) and actually
reimar
parents: 31864
diff changeset
2371 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
2372 }
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
2373 }
8585
27da710563c2 the long-waited MUXER layer, and new MPEG-PS muxer
arpi
parents:
diff changeset
2374
24902
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2375 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
2376 }
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
2377
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
2378
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
2379 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
2380 {
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
2381 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
2382 double fake_timer;
35314
eaace9a7e822 Simplify: remove useless casts, NULL checks etc.
reimar
parents: 35236
diff changeset
2383 muxer_priv_t *priv = 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
2384
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
2385 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
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 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
2388 {
e3d7f52776ff added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents: 15278
diff changeset
2389 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
2390 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
2391 }
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
2392 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
2393 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
2394 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
2395 {
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
2396 priv->scr = 0;
21660
ca9da45d13e9 muxers now write to output muxer->stream rather than to muxer->file
nicodvb
parents: 21544
diff changeset
2397 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
2398 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
2399
32352
76f94c00a69f 1000l, %lf is not valid format string for printf (only for scanf) and actually
reimar
parents: 31864
diff changeset
2400 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
2401 }
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
2402
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
2403 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
2404 {
35314
eaace9a7e822 Simplify: remove useless casts, NULL checks etc.
reimar
parents: 35236
diff changeset
2405 muxer_priv_t *priv = muxer->priv;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
2406
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
2407 mp_msg(MSGT_MUXER, MSGL_INFO, MSGTR_WritingHeader);
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
2408
14753
70c446099f40 new mpeg 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 priv->headers_cnt++;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
2410
14753
70c446099f40 new mpeg 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 //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
2412 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
2413 {
21660
ca9da45d13e9 muxers now write to output muxer->stream rather than to muxer->file
nicodvb
parents: 21544
diff changeset
2414 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
2415 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
2416 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
2417
14753
70c446099f40 new mpeg 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 return;
8585
27da710563c2 the long-waited MUXER layer, and new MPEG-PS muxer
arpi
parents:
diff changeset
2419 }
27da710563c2 the long-waited MUXER layer, and new MPEG-PS muxer
arpi
parents:
diff changeset
2420
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
2421 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
2422 {
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
2423 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
2424 {
21413
06d63614eeaa permit to specify the sizes of the decoders' buffers
nicodvb
parents: 21372
diff changeset
2425 int v = (conf_vbuf_size ? conf_vbuf_size : 232);
06d63614eeaa permit to specify the sizes of the decoders' buffers
nicodvb
parents: 21372
diff changeset
2426 int a1 = (conf_abuf_size ? conf_abuf_size : 4);
06d63614eeaa permit to specify the sizes of the decoders' buffers
nicodvb
parents: 21372
diff changeset
2427 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
2428
14753
70c446099f40 new mpeg 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 priv->sys_info.cnt = 4;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
2430
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
2431 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
2432 priv->sys_info.streams[0].type = 1;
21413
06d63614eeaa permit to specify the sizes of the decoders' buffers
nicodvb
parents: 21372
diff changeset
2433 priv->sys_info.streams[0].bufsize = v*1024;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
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.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
2436 priv->sys_info.streams[1].type = 0;
21413
06d63614eeaa permit to specify the sizes of the decoders' buffers
nicodvb
parents: 21372
diff changeset
2437 priv->sys_info.streams[1].bufsize = a1*1024;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
2438
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
2439 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
2440 priv->sys_info.streams[2].type = 1;
21413
06d63614eeaa permit to specify the sizes of the decoders' buffers
nicodvb
parents: 21372
diff changeset
2441 priv->sys_info.streams[2].bufsize = a2*1024;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
2442
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
2443 priv->sys_info.streams[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
2444 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
2445 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
2446 }
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
2447 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
2448 {
21413
06d63614eeaa permit to specify the sizes of the decoders' buffers
nicodvb
parents: 21372
diff changeset
2449 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
2450 int a1 = (conf_abuf_size ? conf_abuf_size : 4);
06d63614eeaa permit to specify the sizes of the decoders' buffers
nicodvb
parents: 21372
diff changeset
2451
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
2452 priv->sys_info.cnt = 2;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
2453
14753
70c446099f40 new mpeg 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 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
2455 priv->sys_info.streams[0].type = 1;
21413
06d63614eeaa permit to specify the sizes of the decoders' buffers
nicodvb
parents: 21372
diff changeset
2456 priv->sys_info.streams[0].bufsize = v*1024;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
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.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
2459 priv->sys_info.streams[1].type = 0;
21413
06d63614eeaa permit to specify the sizes of the decoders' buffers
nicodvb
parents: 21372
diff changeset
2460 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
2461 }
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
2462 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
2463 priv->sys_info.cnt = 0;
8585
27da710563c2 the long-waited MUXER layer, and new MPEG-PS muxer
arpi
parents:
diff changeset
2464 }
27da710563c2 the long-waited MUXER layer, and new MPEG-PS muxer
arpi
parents:
diff changeset
2465
21467
dd765bcd83aa added generalized teleciner by Donald Graft
nicodvb
parents: 21448
diff changeset
2466 /* 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
2467 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
2468 {
dd765bcd83aa added generalized teleciner by Donald Graft
nicodvb
parents: 21448
diff changeset
2469 unsigned int i, trfp;
dd765bcd83aa added generalized teleciner by Donald Graft
nicodvb
parents: 21448
diff changeset
2470 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
2471 unsigned char ormask[4] = {0x0, 0x2, 0x80, 0x82};
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
2472
21467
dd765bcd83aa added generalized teleciner by Donald Graft
nicodvb
parents: 21448
diff changeset
2473 dfl = (target - source) << 1;
dd765bcd83aa added generalized teleciner by Donald Graft
nicodvb
parents: 21448
diff changeset
2474 tfl = source >> 1;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
2475
21467
dd765bcd83aa added generalized teleciner by Donald Graft
nicodvb
parents: 21448
diff changeset
2476 trfp = 0;
dd765bcd83aa added generalized teleciner by Donald Graft
nicodvb
parents: 21448
diff changeset
2477 for(i = 0; i < MAX_PATTERN_LENGTH; i++)
dd765bcd83aa added generalized teleciner by Donald Graft
nicodvb
parents: 21448
diff changeset
2478 {
dd765bcd83aa added generalized teleciner by Donald Graft
nicodvb
parents: 21448
diff changeset
2479 tfl += dfl;
dd765bcd83aa added generalized teleciner by Donald Graft
nicodvb
parents: 21448
diff changeset
2480 if(tfl >= source)
dd765bcd83aa added generalized teleciner by Donald Graft
nicodvb
parents: 21448
diff changeset
2481 {
dd765bcd83aa added generalized teleciner by Donald Graft
nicodvb
parents: 21448
diff changeset
2482 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
2483 bff_mask[i] = ormask[trfp + 1];
21467
dd765bcd83aa added generalized teleciner by Donald Graft
nicodvb
parents: 21448
diff changeset
2484 trfp ^= 2;
dd765bcd83aa added generalized teleciner by Donald Graft
nicodvb
parents: 21448
diff changeset
2485 }
dd765bcd83aa added generalized teleciner by Donald Graft
nicodvb
parents: 21448
diff changeset
2486 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
2487 bff_mask[i] = ormask[trfp];
21467
dd765bcd83aa added generalized teleciner by Donald Graft
nicodvb
parents: 21448
diff changeset
2488 }
dd765bcd83aa added generalized teleciner by Donald Graft
nicodvb
parents: 21448
diff changeset
2489 }
14753
70c446099f40 new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents: 12341
diff changeset
2490
24902
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2491 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
2492 {
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2493 muxer_priv_t *priv;
30702
9fc9d1e788aa Do not cast the results of malloc/calloc/realloc.
diego
parents: 30633
diff changeset
2494 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
2495 if(priv == NULL)
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2496 return 0;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2497 priv->update_system_header = 1;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
2498
24902
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2499 //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
2500
24902
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2501 if(conf_mux != NULL)
21467
dd765bcd83aa added generalized teleciner by Donald Graft
nicodvb
parents: 21448
diff changeset
2502 {
24902
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2503 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
2504 {
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2505 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
2506 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
2507 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
2508 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
2509 }
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2510 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
2511 {
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2512 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
2513 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
2514 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
2515 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
2516 }
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2517 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
2518 {
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2519 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
2520 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
2521 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
2522 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
2523 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
2524 }
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2525 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
2526 {
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2527 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
2528 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
2529 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
2530 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
2531 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
2532 }
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2533 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
2534 {
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2535 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
2536 priv->rawpes = 1;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2537 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
2538 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
2539 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
2540 }
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2541 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
2542 {
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2543 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
2544 priv->rawpes = 1;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2545 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
2546 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
2547 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
2548 }
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2549 else
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2550 {
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2551 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
2552 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
2553 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
2554 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
2555 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
2556 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
2557 }
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2558 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
2559
24902
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2560 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
2561 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
2562 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
2563 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
2564 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
2565 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
2566 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
2567 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
2568 setup_sys_params(priv);
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
2569
24902
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2570 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
2571 {
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2572 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
2573 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
2574 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
2575 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
2576 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
2577 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
2578 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
2579 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
2580 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
2581 else
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2582 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
2583 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
2584
24902
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2585 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
2586 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
2587 {
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: 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
2589 conf_vframerate = 0;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2590 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
2591
24902
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 == TELECINE_FILM2PAL)
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 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
2595 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
2596 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
2597 }
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2598 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
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 = 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
2602 conf_telecine = TELECINE_DGPULLDOWN;
21467
dd765bcd83aa added generalized teleciner by Donald Graft
nicodvb
parents: 21448
diff changeset
2603 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
2604
24902
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2605 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
2606 {
24902
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2607 int sfps, tfps;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
2608
24902
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2609 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
2610 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
2611 if(sfps % 2 || tfps % 2)
21486
37d60df833cc disable telecining when it can't be applied
nicodvb
parents: 21485
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 sfps *= 2;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2614 tfps *= 2;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2615 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
2616
24902
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2617 if(((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
2618 {
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2619 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
2620 conf_telecine = 0;
37d60df833cc disable telecining when it can't be applied
nicodvb
parents: 21485
diff changeset
2621 }
24902
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2622 else
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2623 {
25720
333540254bb4 Put bff_mask into muxer context instead of a global variable.
reimar
parents: 25098
diff changeset
2624 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
2625 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
2626 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
2627 }
14914
8511347a0475 converted vframerate to CONF_TYPE_FLOAT
nicodvb
parents: 14894
diff changeset
2628 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
2629
24902
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2630 if(conf_vframerate)
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2631 {
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2632 int fps;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
2633
24902
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2634 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
2635 switch(fps)
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2636 {
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2637 case 24000:
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2638 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
2639 break;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2640 case 24024:
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2641 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
2642 break;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2643 case 25025:
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_25;
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 30000:
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_2997;
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 30030:
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_30;
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 50050:
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_50;
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 60000:
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_5994;
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 60060:
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_60;
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 default:
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2662 {
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2663 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
2664 if(conf_telecine)
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2665 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
2666 conf_telecine = 0;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2667 }
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 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
2670
24902
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2671 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
2672 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
2673 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
2674 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
2675 priv->vbitrate = ((conf_vbitrate) * 10) >> 2; //*1000 / 400
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 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
2678 {
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2679 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
2680 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
2681 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
2682 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
2683 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
2684 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
2685 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
2686 if(priv->vframerate)
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, " 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
2688 if(priv->vaspect)
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, " 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
2690 if(priv->vbitrate)
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, " 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
2692 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
2693 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
2694
24902
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2695 priv->has_video = priv->has_audio = 0;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
2696
24902
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2697 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
2698 priv->scr = muxer->file_end = 0;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
2699
24902
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2700 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
2701 {
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2702 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
2703 return 0;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2704 }
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2705 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
2706 priv->init_adelay = - (double) conf_init_adelay / (double) 1000.0;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
2707
24902
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2708 priv->drop = conf_drop;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
2709
30702
9fc9d1e788aa Do not cast the results of malloc/calloc/realloc.
diego
parents: 30633
diff changeset
2710 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
2711 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
2712 {
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2713 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
2714 return 0;
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2715 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
2716
35314
eaace9a7e822 Simplify: remove useless casts, NULL checks etc.
reimar
parents: 35236
diff changeset
2717 muxer->priv = priv;
24902
c1660ecae8c4 100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents: 24631
diff changeset
2718 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
2719 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
2720 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
2721 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
2722 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
2723 return 1;
8585
27da710563c2 the long-waited MUXER layer, and new MPEG-PS muxer
arpi
parents:
diff changeset
2724 }