Mercurial > mplayer.hg
annotate libmpdemux/muxer_mpeg.c @ 27304:d0042136047c
Support -noborder with X11-based vos
author | reimar |
---|---|
date | Tue, 22 Jul 2008 18:38:04 +0000 |
parents | 9fb1d2c3dbd4 |
children | e7c989f7a7c9 |
rev | line source |
---|---|
8585 | 1 |
2 #include <stdio.h> | |
3 #include <stdlib.h> | |
23637 | 4 #include <inttypes.h> |
8585 | 5 #include <string.h> |
6 #include <sys/types.h> | |
7 | |
8 #include "config.h" | |
17012 | 9 #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
|
10 #include "help_mp.h" |
8585 | 11 |
12341
0db4a3a5b01d
removed loader/ dependancy, imported some files from g2, also used patches from Dominik Mierzejewski
alex
parents:
11223
diff
changeset
|
12 #include "aviheader.h" |
0db4a3a5b01d
removed loader/ dependancy, imported some files from g2, also used patches from Dominik Mierzejewski
alex
parents:
11223
diff
changeset
|
13 #include "ms_hdr.h" |
0db4a3a5b01d
removed loader/ dependancy, imported some files from g2, also used patches from Dominik Mierzejewski
alex
parents:
11223
diff
changeset
|
14 |
22605
4d81dbdf46b9
Add explicit location for headers from the stream/ directory.
diego
parents:
22333
diff
changeset
|
15 #include "stream/stream.h" |
8585 | 16 #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
|
17 #include "demuxer.h" |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
18 #include "stheader.h" |
17012 | 19 #include "m_option.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
|
20 #include "mpeg_hdr.h" |
17091 | 21 #include "mp3_hdr.h" |
22 #include "liba52/a52.h" | |
8585 | 23 |
14753
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
24 #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
|
25 #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
|
26 #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
|
27 |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
28 #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
|
29 #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
|
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
|
31 #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
|
32 #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
|
33 |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
34 #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
|
35 #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
|
36 #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
|
37 #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
|
38 #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
|
39 #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
|
40 #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
|
41 //#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
|
42 #define AUDIO_AAC2 0x504D |
14753
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
43 |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
44 #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
|
45 #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
|
46 #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
|
47 #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
|
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 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
|
50 #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
|
51 #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
|
52 #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
|
53 #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
|
54 #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
|
55 #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
|
56 #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
|
57 |
70c446099f40
new mpeg 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 static char ftypes[] = {'?', 'I', 'P', 'B'}; |
70c446099f40
new mpeg 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 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
|
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
|
61 static const char *framerates[] = { |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
62 "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
|
63 }; |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
64 |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
65 static const char *aspect_ratios[] = { |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
66 "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
|
67 }; |
70c446099f40
new mpeg 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 |
70c446099f40
new mpeg 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 static char *conf_mux = "mpeg2"; |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
70 static uint16_t conf_packet_size = 0; //dvd |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
71 static uint32_t conf_muxrate = 0; //kb/s |
15083 | 72 static float conf_vaspect = 0; |
14914 | 73 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
|
74 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
|
75 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
|
76 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
|
77 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
|
78 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
|
79 static int conf_abuf_size = 0; |
06d63614eeaa
permit to specify the sizes of the decoders' buffers
nicodvb
parents:
21372
diff
changeset
|
80 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
|
81 static int conf_drop = 0; |
14840 | 82 static int conf_telecine = 0; |
22929
a60dbae6ee1d
added :interleaving2, a better method to determine which stream whouls be flushed
nicodvb
parents:
22927
diff
changeset
|
83 static int conf_interleaving2 = 0; |
21467 | 84 static float conf_telecine_src = 0; |
85 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
|
86 |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
87 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
|
88 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
|
89 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
|
90 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
|
91 }; |
8585 | 92 |
14753
70c446099f40
new mpeg 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 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
|
94 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
|
95 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
|
96 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
|
97 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
|
98 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
|
99 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
|
100 } 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
|
101 |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
102 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
|
103 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
|
104 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
|
105 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
|
106 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
|
107 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
|
108 } 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
|
109 } 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
|
110 |
70c446099f40
new mpeg 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 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
|
112 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
|
113 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
|
114 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
|
115 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
|
116 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
|
117 } 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
|
118 } 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
|
119 |
18183
ac03acb92d24
introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents:
18181
diff
changeset
|
120 typedef struct { |
ac03acb92d24
introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents:
18181
diff
changeset
|
121 int size; |
ac03acb92d24
introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents:
18181
diff
changeset
|
122 uint64_t dts; |
ac03acb92d24
introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents:
18181
diff
changeset
|
123 } 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
|
124 |
70c446099f40
new mpeg 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 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
|
126 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
|
127 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
|
128 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
|
129 } 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
|
130 |
19cd9e0f8ac4
prevent buffer overflow in the STD; simplified fill_packet() (moving part of the code to get_packet_stats())
nicodvb
parents:
18558
diff
changeset
|
131 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
|
132 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
|
133 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
|
134 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
|
135 uint16_t packet_size; |
21141 | 136 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
|
137 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
|
138 off_t headers_size, data_size; |
18200 | 139 uint64_t scr; |
18183
ac03acb92d24
introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents:
18181
diff
changeset
|
140 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
|
141 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
|
142 uint32_t muxrate; |
18200 | 143 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
|
144 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
|
145 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
|
146 int drop; |
70c446099f40
new mpeg 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 |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
148 //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
|
149 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
|
150 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
|
151 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
|
152 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
|
153 int psm_streams_cnt; |
25720
333540254bb4
Put bff_mask into muxer context instead of a global variable.
reimar
parents:
25098
diff
changeset
|
154 |
333540254bb4
Put bff_mask into muxer context instead of a global variable.
reimar
parents:
25098
diff
changeset
|
155 //2 million frames are enough |
333540254bb4
Put bff_mask into muxer context instead of a global variable.
reimar
parents:
25098
diff
changeset
|
156 #define MAX_PATTERN_LENGTH 2000000 |
333540254bb4
Put bff_mask into muxer context instead of a global variable.
reimar
parents:
25098
diff
changeset
|
157 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
|
158 } 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
|
159 |
70c446099f40
new mpeg 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 |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
161 typedef struct { |
24906 | 162 int has_pts, has_dts, pes_is_aligned, type, min_pes_hlen; |
22328 | 163 int delay_rff; |
18200 | 164 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
|
165 uint32_t buffer_size; |
18200 | 166 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
|
167 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
|
168 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
|
169 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
|
170 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
|
171 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
|
172 int max_tr; |
17301
bbf5438d646a
removed previously forgotten reording options/flags
nicodvb
parents:
17298
diff
changeset
|
173 uint8_t id, is_mpeg12, telecine; |
14840 | 174 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
|
175 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
|
176 mp_mpeg_header_t picture; |
18183
ac03acb92d24
introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents:
18181
diff
changeset
|
177 int max_buffer_size; |
ac03acb92d24
introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents:
18181
diff
changeset
|
178 buffer_track_t *buffer_track; |
ac03acb92d24
introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents:
18181
diff
changeset
|
179 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
|
180 unsigned char *pack; |
ac03acb92d24
introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents:
18181
diff
changeset
|
181 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
|
182 int frames; |
ac03acb92d24
introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents:
18181
diff
changeset
|
183 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
|
184 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
|
185 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
|
186 } 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
|
187 |
17600
6fa1149d8c80
experimental film2pal and ntsc2pal soft teleciner
nicodvb
parents:
17591
diff
changeset
|
188 #define PULLDOWN32 1 |
6fa1149d8c80
experimental film2pal and ntsc2pal soft teleciner
nicodvb
parents:
17591
diff
changeset
|
189 #define TELECINE_FILM2PAL 2 |
21467 | 190 #define TELECINE_DGPULLDOWN 3 |
8585 | 191 |
14753
70c446099f40
new mpeg 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 m_option_t mpegopts_conf[] = { |
22243
e085c85b29af
all options must be GLOBAL; patch by Trent Piepho (xyzzy speakeasy org)
nicodvb
parents:
22142
diff
changeset
|
193 {"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
|
194 {"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
|
195 {"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
|
196 {"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
|
197 {"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
|
198 {"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
|
199 {"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
|
200 {"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
|
201 {"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
|
202 {"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
|
203 {"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
|
204 {"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
|
205 {"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
|
206 {"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
|
207 {"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
|
208 {"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
|
209 {"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
|
210 {"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
|
211 {"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
|
212 {"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
|
213 {"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
|
214 {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
|
215 }; |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
216 |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
217 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
|
218 { |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
219 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
|
220 |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
221 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
|
222 { |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
223 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
|
224 { |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
225 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
|
226 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
|
227 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
|
228 } |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
229 } |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
230 } |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
231 |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
232 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
|
233 { |
26758
9fb1d2c3dbd4
cosmetics: Remove pointless parentheses from return statements.
diego
parents:
26570
diff
changeset
|
234 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
|
235 (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
|
236 (x == mmioFOURCC('m','p','g','1')) || |
26758
9fb1d2c3dbd4
cosmetics: Remove pointless parentheses from return statements.
diego
parents:
26570
diff
changeset
|
237 (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
|
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 |
70c446099f40
new mpeg 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 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
|
241 { |
26758
9fb1d2c3dbd4
cosmetics: Remove pointless parentheses from return statements.
diego
parents:
26570
diff
changeset
|
242 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
|
243 (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
|
244 (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
|
245 (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
|
246 (x == mmioFOURCC('m','p','e','g')) || |
26758
9fb1d2c3dbd4
cosmetics: Remove pointless parentheses from return statements.
diego
parents:
26570
diff
changeset
|
247 (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
|
248 } |
8585 | 249 |
14753
70c446099f40
new mpeg 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 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
|
251 { |
26758
9fb1d2c3dbd4
cosmetics: Remove pointless parentheses from return statements.
diego
parents:
26570
diff
changeset
|
252 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
|
253 (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
|
254 (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
|
255 (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
|
256 (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
|
257 (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
|
258 (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
|
259 (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
|
260 (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
|
261 (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
|
262 (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
|
263 (x == mmioFOURCC('F', 'M','P','4')) || |
18164 | 264 (x == mmioFOURCC('f', 'm','p','4')) || |
265 (x == mmioFOURCC('D', 'X','5','0')) || | |
26758
9fb1d2c3dbd4
cosmetics: Remove pointless parentheses from return statements.
diego
parents:
26570
diff
changeset
|
266 (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
|
267 } |
70c446099f40
new mpeg 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 |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
269 //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
|
270 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
|
271 { |
70c446099f40
new mpeg 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 uint32_t i, j, CRCTab[256], 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
|
273 |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
274 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
|
275 { |
70c446099f40
new mpeg 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 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
|
277 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
|
278 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
|
279 } |
70c446099f40
new mpeg 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 |
70c446099f40
new mpeg 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 |
70c446099f40
new mpeg 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 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
|
283 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
|
284 crc = (crc << 8) ^ CRCTab[((crc >> 24) ^ buff[i]) & 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
|
285 |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
286 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
|
287 } |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
288 |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
289 |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
290 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
|
291 { |
70c446099f40
new mpeg 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 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
|
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 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
|
295 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
|
296 priv->psm_info.streams[i].format = 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
|
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 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
|
299 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
|
300 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
|
301 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
|
302 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
|
303 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
|
304 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
|
305 priv->psm_info.streams[i].type = 0x03; |
15278
a45c7e1b998f
added support for AAC; moved most of MSGL_V to MSGL_DBG2 to reduce verbosity
nicodvb
parents:
15083
diff
changeset
|
306 else if(format == AUDIO_AAC1 || format == AUDIO_AAC2) |
a45c7e1b998f
added support for AAC; moved most of MSGL_V to MSGL_DBG2 to reduce verbosity
nicodvb
parents:
15083
diff
changeset
|
307 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
|
308 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
|
309 priv->psm_info.streams[i].type = 0x81; |
70c446099f40
new mpeg 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 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
|
312 memcpy((char*) &(priv->psm_info.streams[i].format), "AC-3", 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
|
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 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
|
315 } |
70c446099f40
new mpeg 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 |
70c446099f40
new mpeg 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 |
70c446099f40
new mpeg 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 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
|
319 { |
70c446099f40
new mpeg 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 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
|
321 uint16_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
|
322 |
70c446099f40
new mpeg 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 tmp = (mpeg_frame_t *) calloc(num, sizeof(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
|
324 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
|
325 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
|
326 |
70c446099f40
new mpeg 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 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
|
328 { |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
329 tmp[i].buffer = (uint8_t *) calloc(1, 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
|
330 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
|
331 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
|
332 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
|
333 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
|
334 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
|
335 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
|
336 } |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
337 |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
338 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
|
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 |
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
|
341 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 | 342 |
343 static muxer_stream_t* mpegfile_new_stream(muxer_t *muxer,int type){ | |
18196
f7f6984638f8
finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents:
18192
diff
changeset
|
344 muxer_priv_t *priv = (muxer_priv_t*) muxer->priv; |
8585 | 345 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
|
346 muxer_headers_t *spriv; |
8585 | 347 |
9007
12fc55eb3373
Cleanup of the muxer API, func parameters muxer & muxer_f eliminated.
arpi
parents:
8585
diff
changeset
|
348 if (!muxer) return NULL; |
8585 | 349 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
|
350 mp_msg(MSGT_MUXER, MSGL_ERR, "Too many streams! increase MUXER_MAX_STREAMS !\n"); |
8585 | 351 return NULL; |
352 } | |
353 switch (type) { | |
354 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
|
355 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
|
356 mp_msg(MSGT_MUXER, MSGL_ERR, "MPEG files can't contain more than 16 video streams!\n"); |
8585 | 357 return NULL; |
358 } | |
359 break; | |
360 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
|
361 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
|
362 mp_msg(MSGT_MUXER, MSGL_ERR, "MPEG files can't contain more than 16 audio streams!\n"); |
8585 | 363 return NULL; |
364 } | |
365 break; | |
366 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
|
367 mp_msg(MSGT_MUXER, MSGL_ERR, "Unknown stream type!\n"); |
8585 | 368 return NULL; |
369 } | |
14753
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
370 s = (muxer_stream_t*) calloc(1, sizeof(muxer_stream_t)); |
8585 | 371 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
|
372 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
|
373 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
|
374 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
|
375 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
|
376 s->b_buffer_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
|
377 s->priv = (muxer_headers_t*) 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
|
378 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
|
379 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
|
380 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
|
381 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
|
382 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
|
383 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
|
384 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
|
385 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
|
386 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
|
387 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
|
388 spriv->track_len = 4096; |
8585 | 389 muxer->streams[muxer->avih.dwStreams]=s; |
390 s->type=type; | |
391 s->id=muxer->avih.dwStreams; | |
9007
12fc55eb3373
Cleanup of the muxer API, func parameters muxer & muxer_f eliminated.
arpi
parents:
8585
diff
changeset
|
392 s->muxer=muxer; |
22879 | 393 |
11223 | 394 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
|
395 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
|
396 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
|
397 if(conf_init_vdelay) { |
2d01760be338
removed init_apts and init_vpts; added :adelay in addition to :vdelay
nicodvb
parents:
22879
diff
changeset
|
398 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
|
399 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
|
400 } |
14753
70c446099f40
new mpeg 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->id = 0xe0 + muxer->num_videos; |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
402 s->ckid = be2me_32 (0x100 + spriv->id); |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
403 if(priv->is_genmpeg1 || priv->is_genmpeg2) { |
21413
06d63614eeaa
permit to specify the sizes of the decoders' buffers
nicodvb
parents:
21372
diff
changeset
|
404 int v = (conf_vbuf_size ? conf_vbuf_size*1024 : |
06d63614eeaa
permit to specify the sizes of the decoders' buffers
nicodvb
parents:
21372
diff
changeset
|
405 (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
|
406 int n = priv->sys_info.cnt; |
22879 | 407 |
14753
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
408 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
|
409 priv->sys_info.streams[n].type = 1; |
21413
06d63614eeaa
permit to specify the sizes of the decoders' buffers
nicodvb
parents:
21372
diff
changeset
|
410 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
|
411 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
|
412 } |
11223 | 413 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
|
414 priv->has_video++; |
11223 | 415 s->h.fccType=streamtypeVIDEO; |
416 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
|
417 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
|
418 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
|
419 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
|
420 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
|
421 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
|
422 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
|
423 } |
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
|
424 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
|
425 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
|
426 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
|
427 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
|
428 spriv->min_pes_hlen = 22; |
14840 | 429 spriv->telecine = conf_telecine; |
11223 | 430 mp_msg (MSGT_MUXER, MSGL_DBG2, "Added video stream %d, ckid=%X\n", muxer->num_videos, s->ckid); |
431 } 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
|
432 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
|
433 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
|
434 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
|
435 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
|
436 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
|
437 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
|
438 spriv->id = 0xc0 + muxer->num_audios; |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
439 s->ckid = be2me_32 (0x100 + spriv->id); |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
440 if(priv->is_genmpeg1 || priv->is_genmpeg2) { |
21413
06d63614eeaa
permit to specify the sizes of the decoders' buffers
nicodvb
parents:
21372
diff
changeset
|
441 int a1 = (conf_abuf_size ? conf_abuf_size*1024 : |
06d63614eeaa
permit to specify the sizes of the decoders' buffers
nicodvb
parents:
21372
diff
changeset
|
442 (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
|
443 int n = priv->sys_info.cnt; |
22879 | 444 |
14753
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
445 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
|
446 priv->sys_info.streams[n].type = 0; |
21413
06d63614eeaa
permit to specify the sizes of the decoders' buffers
nicodvb
parents:
21372
diff
changeset
|
447 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
|
448 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
|
449 } |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
450 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
|
451 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
|
452 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
|
453 spriv->min_pes_hlen = 17; |
22879 | 454 |
14753
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
455 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
|
456 priv->has_audio++; |
11223 | 457 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
|
458 |
e3d7f52776ff
added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents:
15278
diff
changeset
|
459 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
|
460 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
|
461 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
|
462 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
|
463 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
|
464 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
|
465 } |
e3d7f52776ff
added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents:
15278
diff
changeset
|
466 |
11223 | 467 mp_msg (MSGT_MUXER, MSGL_DBG2, "Added audio stream %d, ckid=%X\n", s->id - muxer->num_videos + 1, s->ckid); |
468 } | |
8585 | 469 muxer->avih.dwStreams++; |
470 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
|
471 |
f7f6984638f8
finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents:
18192
diff
changeset
|
472 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
|
473 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
|
474 { |
f7f6984638f8
finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents:
18192
diff
changeset
|
475 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
|
476 { |
f7f6984638f8
finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents:
18192
diff
changeset
|
477 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
|
478 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
|
479 free(spriv->pack); |
f7f6984638f8
finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents:
18192
diff
changeset
|
480 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
|
481 free(spriv->buffer_track); |
f7f6984638f8
finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents:
18192
diff
changeset
|
482 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
|
483 } |
f7f6984638f8
finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents:
18192
diff
changeset
|
484 if(s->b_buffer) |
f7f6984638f8
finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents:
18192
diff
changeset
|
485 free(s->b_buffer); |
f7f6984638f8
finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents:
18192
diff
changeset
|
486 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
|
487 } |
f7f6984638f8
finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents:
18192
diff
changeset
|
488 return NULL; |
8585 | 489 } |
490 | |
14753
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
491 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
|
492 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
|
493 b[0] = mod | ((ts >> 29) & 0xf) | 1; |
8585 | 494 b[1] = (ts >> 22) & 0xff; |
495 b[2] = ((ts >> 14) & 0xff) | 1; | |
496 b[3] = (ts >> 7) & 0xff; | |
497 b[4] = ((ts << 1) & 0xff) | 1; | |
498 } | |
499 | |
14753
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
500 |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
501 static void write_mpeg_rate(int type, unsigned char *b, unsigned int rate) |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
502 { |
22924
4822223d8425
small syntax fix: muxrate is expressed in units of 400 bits/second, not 50 bytes per second
nicodvb
parents:
22917
diff
changeset
|
503 rate = ((rate*8)+399) / 400; |
14753
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
504 |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
505 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
|
506 { |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
507 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
|
508 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
|
509 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
|
510 } |
70c446099f40
new mpeg 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 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
|
512 { |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
513 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
|
514 b[1] = (rate >> 6) & 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
|
515 b[2] = ((rate & 0x3f) << 2) | 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
|
516 } |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
517 } |
70c446099f40
new mpeg 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 |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
519 |
70c446099f40
new mpeg 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 static void write_mpeg_std(unsigned char *b, unsigned int size, unsigned int type, uint8_t 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
|
521 { |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
522 //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
|
523 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
|
524 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
|
525 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
|
526 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
|
527 |
70c446099f40
new mpeg 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 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
|
529 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
|
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] = ((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
|
532 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
|
533 } |
70c446099f40
new mpeg 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 static void write_mpeg2_scr(unsigned char *b, uint64_t ts) |
70c446099f40
new mpeg 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 { |
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
|
537 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
|
538 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
|
539 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
|
540 ts &= 0x1FFFFFFFFULL; //33 bits |
14753
70c446099f40
new mpeg 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 t1 = (ts >> 30) & 0x7;; |
70c446099f40
new mpeg 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 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
|
543 t3 = ts & 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
|
544 |
70c446099f40
new mpeg 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 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
|
546 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
|
547 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
|
548 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
|
549 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
|
550 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
|
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 |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
553 |
70c446099f40
new mpeg 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 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
|
555 { |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
556 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
|
557 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
|
558 |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
559 priv = (muxer_priv_t *) muxer->priv; |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
560 *(uint32_t *)buff = be2me_32(PACK_HEADER_START_CODE); |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
561 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
|
562 { |
70c446099f40
new mpeg 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 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
|
564 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
|
565 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
|
566 } |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
567 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
|
568 { |
70c446099f40
new mpeg 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 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
|
570 write_mpeg_rate(priv->mux, &buff[10], 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
|
571 buff[13] = 0xf8; //5 bits reserved + 3 set to 0 to indicate 0 stuffing bytes |
70c446099f40
new mpeg 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 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
|
573 } |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
574 |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
575 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
|
576 } |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
577 |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
578 |
70c446099f40
new mpeg 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 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
|
580 { |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
581 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
|
582 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
|
583 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
|
584 priv = (muxer_priv_t *) muxer->priv; |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
585 |
70c446099f40
new mpeg 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 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
|
587 *(uint32_t *)(&buff[len]) = be2me_32(SYSTEM_HEADER_START_CODE); |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
588 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
|
589 *(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
|
590 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
|
591 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
|
592 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
|
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 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
|
595 //stolen from libavformat |
a8f534c4e071
in the system header set audio_locked/video_locked only for dvd and vcd
nicodvb
parents:
22924
diff
changeset
|
596 if(priv->is_xvcd || priv->is_dvd) |
22926 | 597 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
|
598 else |
22926 | 599 buff[len++] = 0x21; //marker, 1 video stream bound |
14753
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
600 |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
601 buff[len++] = ((priv->mux == MUX_MPEG1) ? 0xff : 0x7f); //in mpeg2 there's the packet rate restriction |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
602 |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
603 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
|
604 { |
70c446099f40
new mpeg 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 buff[len++] = priv->sys_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
|
606 write_mpeg_std(&buff[len], priv->sys_info.streams[i].bufsize, priv->sys_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
|
607 (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
|
608 len += 2; |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
609 } |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
610 |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
611 *(uint16_t *)(&buff[4]) = be2me_16(len - 6); // length field fixed |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
612 |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
613 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
|
614 } |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
615 |
70c446099f40
new mpeg 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 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
|
617 { |
70c446099f40
new mpeg 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 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
|
619 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
|
620 uint16_t dlen; |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
621 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
|
622 priv = (muxer_priv_t *) muxer->priv; |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
623 |
70c446099f40
new mpeg 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 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
|
625 *(uint32_t *)(&buff[len]) = be2me_32(PSM_START_CODE); |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
626 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
|
627 *(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
|
628 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
|
629 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
|
630 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
|
631 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
|
632 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
|
633 *(uint16_t *)(&buff[len]) = 0; //length of the es descriptors |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
634 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
|
635 |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
636 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
|
637 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
|
638 { |
70c446099f40
new mpeg 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 if( |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
640 (priv->psm_info.streams[i].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
|
641 (priv->psm_info.streams[i].id >= 0xe0 && priv->psm_info.streams[i].id <= 0xef) || |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
642 (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
|
643 ) |
70c446099f40
new mpeg 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 { |
70c446099f40
new mpeg 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++] = 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
|
646 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
|
647 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
|
648 buff[len++] = 0; //... lower |
14753
70c446099f40
new mpeg 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 |
24903
b4cdc74f4496
remove the registration descriptor from the PSM: writing the fourcc in it makes it total crap
nicodvb
parents:
24902
diff
changeset
|
650 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
|
651 } |
70c446099f40
new mpeg 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 } |
70c446099f40
new mpeg 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 *(uint16_t *)(&buff[10]) = be2me_16(dlen); //length of the es descriptors |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
654 |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
655 *(uint16_t *)(&buff[4]) = be2me_16(len - 6 + 4); // length field fixed, including size of CRC32 |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
656 |
19637 | 657 *(uint32_t *)(&buff[len]) = be2me_32(CalcCRC32(buff, 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
|
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 len += 4; //for 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
|
660 |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
661 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
|
662 } |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
663 |
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
|
664 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
|
665 { |
26758
9fb1d2c3dbd4
cosmetics: Remove pointless parentheses from return statements.
diego
parents:
26570
diff
changeset
|
666 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
|
667 } |
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
|
668 |
14753
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
669 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
|
670 { |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
671 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
|
672 |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
673 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
|
674 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
|
675 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
|
676 |
70c446099f40
new mpeg 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 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
|
678 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
|
679 |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
680 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
|
681 { |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
682 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
|
683 { |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
684 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
|
685 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
|
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 |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
688 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
|
689 { |
70c446099f40
new mpeg 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 write_mpeg_std(&buff[len], h->buffer_size, h->type, 0x40); // 01 is pes1 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
|
691 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
|
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 } |
70c446099f40
new mpeg 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 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
|
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 buff[len] = (h->pes_is_aligned ? 0x84 : 0x80); //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
|
697 len++; |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
698 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
|
699 len++; |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
700 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
|
701 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 } |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
703 |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
704 |
70c446099f40
new mpeg 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 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
|
706 { |
70c446099f40
new mpeg 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 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
|
708 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
|
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 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
|
711 { |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
712 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
|
713 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
|
714 } |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
715 } |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
716 else |
70c446099f40
new mpeg 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 { |
70c446099f40
new mpeg 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 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
|
719 { |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
720 buff[len] = 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
|
721 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
|
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 } |
70c446099f40
new mpeg 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 |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
725 |
70c446099f40
new mpeg 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(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
|
727 { |
14753
70c446099f40
new mpeg 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 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
|
729 { |
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
|
730 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
|
731 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
|
732 |
70c446099f40
new mpeg 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 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
|
734 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
|
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 |
70c446099f40
new mpeg 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 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
|
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 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
|
740 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
|
741 } |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
742 } |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
743 |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
744 *((uint16_t*) &buff[4]) = be2me_16(len + plen - 6); //fix pes 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
|
745 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
|
746 } |
70c446099f40
new mpeg 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 |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
748 |
70c446099f40
new mpeg 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 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
|
750 { |
70c446099f40
new mpeg 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 //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
|
752 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
|
753 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
|
754 buff[3] = 0xbe; |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
755 *((uint16_t*) &buff[4]) = be2me_16(len - 6); |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
756 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
|
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 |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
760 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
|
761 { |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
762 // 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
|
763 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
|
764 |
15278
a45c7e1b998f
added support for AAC; moved most of MSGL_V to MSGL_DBG2 to reduce verbosity
nicodvb
parents:
15083
diff
changeset
|
765 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
|
766 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
|
767 *(uint32_t *)(&buff[len]) = be2me_32(PES_PRIVATE2); |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
768 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
|
769 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
|
770 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
|
771 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
|
772 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
|
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 *(uint32_t *)(&buff[len]) = be2me_32(PES_PRIVATE2); |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
775 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
|
776 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
|
777 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
|
778 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
|
779 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
|
780 |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
781 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
|
782 } |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
783 |
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
|
784 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
|
785 { |
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
|
786 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
|
787 } |
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
|
788 |
14753
70c446099f40
new mpeg 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 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
|
790 { |
70c446099f40
new mpeg 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 uint32_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
|
792 |
70c446099f40
new mpeg 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 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
|
794 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
|
795 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
|
796 len = 9; |
14753
70c446099f40
new mpeg 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 |
70c446099f40
new mpeg 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 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
|
799 { |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
800 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
|
801 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
|
802 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
|
803 } |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
804 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
|
805 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
|
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 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
|
808 { |
70c446099f40
new mpeg 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_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
|
810 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
|
811 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
|
812 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
|
813 } |
70c446099f40
new mpeg 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 |
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
|
815 //len = max(h->min_pes_hlen, 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
|
816 |
70c446099f40
new mpeg 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 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
|
818 } |
70c446099f40
new mpeg 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 |
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
|
820 |
21660
ca9da45d13e9
muxers now write to output muxer->stream rather than to muxer->file
nicodvb
parents:
21544
diff
changeset
|
821 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
|
822 { |
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
|
823 size_t tot, offset; |
14753
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
824 muxer_priv_t *priv; |
18196
f7f6984638f8
finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents:
18192
diff
changeset
|
825 unsigned char *buff; |
f7f6984638f8
finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents:
18192
diff
changeset
|
826 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
|
827 |
70c446099f40
new mpeg 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 priv = (muxer_priv_t *) muxer->priv; |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
829 buff = priv->buff; |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
830 |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
831 if(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
|
832 { |
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
|
833 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
|
834 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
|
835 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
|
836 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
|
837 buff[offset + 3] = 0xb9; |
f7f6984638f8
finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents:
18192
diff
changeset
|
838 |
21660
ca9da45d13e9
muxers now write to output muxer->stream rather than to muxer->file
nicodvb
parents:
21544
diff
changeset
|
839 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
|
840 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
|
841 } |
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 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
|
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 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
|
845 offset += write_mpeg_system_header(muxer, &buff[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
|
846 |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
847 //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
|
848 |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
849 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
|
850 offset += write_nav_pack(&buff[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
|
851 |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
852 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
|
853 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
|
854 { |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
855 //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
|
856 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
|
857 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
|
858 } |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
859 |
21660
ca9da45d13e9
muxers now write to output muxer->stream rather than to muxer->file
nicodvb
parents:
21544
diff
changeset
|
860 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
|
861 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
|
862 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
|
863 muxer->movi_end += 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
|
864 |
70c446099f40
new mpeg 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 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
|
866 } |
70c446099f40
new mpeg 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 |
22142
84f95595f31f
Fix a few gcc warnings, approved by Diego and Reimar.
rathann
parents:
21660
diff
changeset
|
869 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
|
870 { |
ac03acb92d24
introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents:
18181
diff
changeset
|
871 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
|
872 |
ac03acb92d24
introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents:
18181
diff
changeset
|
873 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
|
874 { |
ac03acb92d24
introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents:
18181
diff
changeset
|
875 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
|
876 if(!tmp) |
ac03acb92d24
introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents:
18181
diff
changeset
|
877 { |
ac03acb92d24
introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents:
18181
diff
changeset
|
878 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
|
879 return; |
18183
ac03acb92d24
introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents:
18181
diff
changeset
|
880 } |
ac03acb92d24
introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents:
18181
diff
changeset
|
881 spriv->buffer_track = tmp; |
ac03acb92d24
introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents:
18181
diff
changeset
|
882 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
|
883 spriv->track_len += 16; |
ac03acb92d24
introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents:
18181
diff
changeset
|
884 } |
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 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
|
887 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
|
888 |
ac03acb92d24
introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents:
18181
diff
changeset
|
889 spriv->track_pos++; |
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 |
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
|
892 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
|
893 { |
f7f6984638f8
finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents:
18192
diff
changeset
|
894 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
|
895 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
|
896 |
f7f6984638f8
finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents:
18192
diff
changeset
|
897 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
|
898 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
|
899 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
|
900 { |
f7f6984638f8
finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents:
18192
diff
changeset
|
901 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
|
902 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
|
903 } |
f7f6984638f8
finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents:
18192
diff
changeset
|
904 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
|
905 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
|
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 |
18197 | 908 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
|
909 { |
ac03acb92d24
introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents:
18181
diff
changeset
|
910 mpeg_frame_t tmp; |
ac03acb92d24
introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents:
18181
diff
changeset
|
911 int i; |
ac03acb92d24
introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents:
18181
diff
changeset
|
912 |
ac03acb92d24
introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents:
18181
diff
changeset
|
913 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
|
914 { |
ac03acb92d24
introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents:
18181
diff
changeset
|
915 tmp = spriv->framebuf[i - n]; |
ac03acb92d24
introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents:
18181
diff
changeset
|
916 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
|
917 spriv->framebuf[i] = tmp; |
ac03acb92d24
introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents:
18181
diff
changeset
|
918 } |
ac03acb92d24
introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents:
18181
diff
changeset
|
919 spriv->framebuf_used -= n; |
ac03acb92d24
introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents:
18181
diff
changeset
|
920 } |
14753
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
921 |
18192
0b77e66a7d32
introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents:
18187
diff
changeset
|
922 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
|
923 { |
0b77e66a7d32
introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents:
18187
diff
changeset
|
924 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
|
925 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
|
926 |
0b77e66a7d32
introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents:
18187
diff
changeset
|
927 n = len = 0; |
0b77e66a7d32
introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents:
18187
diff
changeset
|
928 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
|
929 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
|
930 { |
0b77e66a7d32
introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents:
18187
diff
changeset
|
931 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
|
932 return len; |
21531
a90aa203186c
Get rid of min/max macros from aviheader.h, they do not belong here.
reimar
parents:
21486
diff
changeset
|
933 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
|
934 len += m; |
0b77e66a7d32
introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents:
18187
diff
changeset
|
935 frpos += m; |
0b77e66a7d32
introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents:
18187
diff
changeset
|
936 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
|
937 { |
0b77e66a7d32
introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents:
18187
diff
changeset
|
938 frpos = 0; |
0b77e66a7d32
introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents:
18187
diff
changeset
|
939 n++; |
0b77e66a7d32
introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents:
18187
diff
changeset
|
940 } |
0b77e66a7d32
introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents:
18187
diff
changeset
|
941 } |
0b77e66a7d32
introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents:
18187
diff
changeset
|
942 |
0b77e66a7d32
introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents:
18187
diff
changeset
|
943 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
|
944 return 0; |
0b77e66a7d32
introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents:
18187
diff
changeset
|
945 return len; |
0b77e66a7d32
introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents:
18187
diff
changeset
|
946 } |
0b77e66a7d32
introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents:
18187
diff
changeset
|
947 |
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
|
948 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
|
949 { |
0b77e66a7d32
introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents:
18187
diff
changeset
|
950 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
|
951 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
|
952 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
|
953 |
0b77e66a7d32
introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents:
18187
diff
changeset
|
954 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
|
955 return 0; |
0b77e66a7d32
introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents:
18187
diff
changeset
|
956 |
0b77e66a7d32
introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents:
18187
diff
changeset
|
957 spts = spriv->pts; |
0b77e66a7d32
introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents:
18187
diff
changeset
|
958 sdts = spriv->dts; |
0b77e66a7d32
introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents:
18187
diff
changeset
|
959 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
|
960 ret = 0; |
0b77e66a7d32
introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents:
18187
diff
changeset
|
961 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
|
962 i = 0; |
0b77e66a7d32
introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents:
18187
diff
changeset
|
963 else |
0b77e66a7d32
introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents:
18187
diff
changeset
|
964 { |
0b77e66a7d32
introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents:
18187
diff
changeset
|
965 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
|
966 |
0b77e66a7d32
introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents:
18187
diff
changeset
|
967 if(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
|
968 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
|
969 |
0b77e66a7d32
introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents:
18187
diff
changeset
|
970 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
|
971 |
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
|
972 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
|
973 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
|
974 else |
0b77e66a7d32
introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents:
18187
diff
changeset
|
975 { |
0b77e66a7d32
introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents:
18187
diff
changeset
|
976 if(spriv->framebuf_used < 2) |
0b77e66a7d32
introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents:
18187
diff
changeset
|
977 goto fail; |
0b77e66a7d32
introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents:
18187
diff
changeset
|
978 |
0b77e66a7d32
introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents:
18187
diff
changeset
|
979 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
|
980 threshold = 5; |
0b77e66a7d32
introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents:
18187
diff
changeset
|
981 else |
0b77e66a7d32
introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents:
18187
diff
changeset
|
982 threshold = 10; |
0b77e66a7d32
introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents:
18187
diff
changeset
|
983 |
0b77e66a7d32
introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents:
18187
diff
changeset
|
984 //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
|
985 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
|
986 i = 1; |
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 i = -1; |
0b77e66a7d32
introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents:
18187
diff
changeset
|
989 } |
0b77e66a7d32
introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents:
18187
diff
changeset
|
990 } |
0b77e66a7d32
introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents:
18187
diff
changeset
|
991 |
0b77e66a7d32
introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents:
18187
diff
changeset
|
992 if(i > -1) |
0b77e66a7d32
introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents:
18187
diff
changeset
|
993 { |
21531
a90aa203186c
Get rid of min/max macros from aviheader.h, they do not belong here.
reimar
parents:
21486
diff
changeset
|
994 dpts = FFMAX(spriv->last_saved_pts, spriv->framebuf[i].pts) - |
a90aa203186c
Get rid of min/max macros from aviheader.h, they do not belong here.
reimar
parents:
21486
diff
changeset
|
995 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
|
996 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
|
997 |
0b77e66a7d32
introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents:
18187
diff
changeset
|
998 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
|
999 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
|
1000 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
|
1001 ret = 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 if(ret) |
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 *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
|
1006 *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
|
1007 if(*dts == *pts) |
0b77e66a7d32
introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents:
18187
diff
changeset
|
1008 *dts = 0; |
0b77e66a7d32
introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents:
18187
diff
changeset
|
1009 } |
0b77e66a7d32
introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents:
18187
diff
changeset
|
1010 } |
0b77e66a7d32
introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents:
18187
diff
changeset
|
1011 |
0b77e66a7d32
introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents:
18187
diff
changeset
|
1012 fail: |
0b77e66a7d32
introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents:
18187
diff
changeset
|
1013 spriv->pts = spts; |
0b77e66a7d32
introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents:
18187
diff
changeset
|
1014 spriv->dts = sdts; |
0b77e66a7d32
introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents:
18187
diff
changeset
|
1015 return ret; |
0b77e66a7d32
introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents:
18187
diff
changeset
|
1016 } |
0b77e66a7d32
introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents:
18187
diff
changeset
|
1017 |
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
|
1018 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
|
1019 { |
19cd9e0f8ac4
prevent buffer overflow in the STD; simplified fill_packet() (moving part of the code to get_packet_stats())
nicodvb
parents:
18558
diff
changeset
|
1020 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
|
1021 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
|
1022 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
|
1023 |
19cd9e0f8ac4
prevent buffer overflow in the STD; simplified fill_packet() (moving part of the code to get_packet_stats())
nicodvb
parents:
18558
diff
changeset
|
1024 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
|
1025 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
|
1026 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
|
1027 |
21141 | 1028 if(priv->rawpes) |
1029 pack_hlen = 0; | |
1030 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
|
1031 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
|
1032 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
|
1033 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
|
1034 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
|
1035 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
|
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 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
|
1038 { |
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->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
|
1040 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
|
1041 |
19cd9e0f8ac4
prevent buffer overflow in the STD; simplified fill_packet() (moving part of the code to get_packet_stats())
nicodvb
parents:
18558
diff
changeset
|
1042 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
|
1043 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
|
1044 } |
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 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
|
1046 |
19cd9e0f8ac4
prevent buffer overflow in the STD; simplified fill_packet() (moving part of the code to get_packet_stats())
nicodvb
parents:
18558
diff
changeset
|
1047 p->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
|
1048 |
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 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
|
1050 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
|
1051 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
|
1052 else |
19cd9e0f8ac4
prevent buffer overflow in the STD; simplified fill_packet() (moving part of the code to get_packet_stats())
nicodvb
parents:
18558
diff
changeset
|
1053 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
|
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 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
|
1056 target -= 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
|
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 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
|
1059 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
|
1060 { |
19cd9e0f8ac4
prevent buffer overflow in the STD; simplified fill_packet() (moving part of the code to get_packet_stats())
nicodvb
parents:
18558
diff
changeset
|
1061 //p->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
|
1062 //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
|
1063 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
|
1064 //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
|
1065 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
|
1066 } |
19cd9e0f8ac4
prevent buffer overflow in the STD; simplified fill_packet() (moving part of the code to get_packet_stats())
nicodvb
parents:
18558
diff
changeset
|
1067 |
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 = 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
|
1069 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
|
1070 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
|
1071 { |
19cd9e0f8ac4
prevent buffer overflow in the STD; simplified fill_packet() (moving part of the code to get_packet_stats())
nicodvb
parents:
18558
diff
changeset
|
1072 if(s->type == MUXER_TYPE_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
|
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 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
|
1075 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
|
1076 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
|
1077 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
|
1078 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
|
1079 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
|
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 |
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 = 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
|
1083 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
|
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(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
|
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 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
|
1088 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
|
1089 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
|
1090 } |
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 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
|
1092 { |
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 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
|
1094 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
|
1095 } |
19cd9e0f8ac4
prevent buffer overflow in the STD; simplified fill_packet() (moving part of the code to get_packet_stats())
nicodvb
parents:
18558
diff
changeset
|
1096 } |
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 |
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 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
|
1100 |
19cd9e0f8ac4
prevent buffer overflow in the STD; simplified fill_packet() (moving part of the code to get_packet_stats())
nicodvb
parents:
18558
diff
changeset
|
1101 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
|
1102 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
|
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 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
|
1105 } |
18192
0b77e66a7d32
introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents:
18187
diff
changeset
|
1106 |
0b77e66a7d32
introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents:
18187
diff
changeset
|
1107 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
|
1108 { |
0b77e66a7d32
introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents:
18187
diff
changeset
|
1109 //try to fill a packet as much as possible |
25962 | 1110 //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
|
1111 //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
|
1112 //if audio and a52 insert the headers |
0b77e66a7d32
introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents:
18187
diff
changeset
|
1113 muxer_priv_t *priv = (muxer_priv_t *) muxer->priv; |
0b77e66a7d32
introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents:
18187
diff
changeset
|
1114 muxer_headers_t *spriv = (muxer_headers_t *) s->priv; |
18958
a8e681ad7c90
Remove unused variables, patch by Stefan Huehner stefan at huehner org.
diego
parents:
18751
diff
changeset
|
1115 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
|
1116 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
|
1117 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
|
1118 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
|
1119 |
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
|
1120 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
|
1121 |
0b77e66a7d32
introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents:
18187
diff
changeset
|
1122 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
|
1123 { |
0b77e66a7d32
introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents:
18187
diff
changeset
|
1124 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
|
1125 return 0; |
0b77e66a7d32
introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents:
18187
diff
changeset
|
1126 } |
0b77e66a7d32
introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents:
18187
diff
changeset
|
1127 |
0b77e66a7d32
introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents:
18187
diff
changeset
|
1128 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
|
1129 { |
21141 | 1130 if(priv->rawpes) |
1131 spriv->pack_offset = 0; | |
1132 else | |
18192
0b77e66a7d32
introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents:
18187
diff
changeset
|
1133 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
|
1134 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
|
1135 { |
0b77e66a7d32
introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents:
18187
diff
changeset
|
1136 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
|
1137 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
|
1138 } |
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
|
1139 |
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
|
1140 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
|
1141 { |
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
|
1142 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
|
1143 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
|
1144 } |
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
|
1145 |
18192
0b77e66a7d32
introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents:
18187
diff
changeset
|
1146 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
|
1147 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
|
1148 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
|
1149 spriv->frames = 0; |
0b77e66a7d32
introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents:
18187
diff
changeset
|
1150 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
|
1151 } |
0b77e66a7d32
introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents:
18187
diff
changeset
|
1152 |
0b77e66a7d32
introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents:
18187
diff
changeset
|
1153 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
|
1154 { |
21413
06d63614eeaa
permit to specify the sizes of the decoders' buffers
nicodvb
parents:
21372
diff
changeset
|
1155 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
|
1156 //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
|
1157 //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
|
1158 //NB pts and dts can only be relative to the first frame beginning in this pack |
21141 | 1159 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
|
1160 { |
06d63614eeaa
permit to specify the sizes of the decoders' buffers
nicodvb
parents:
21372
diff
changeset
|
1161 if(s->type == MUXER_TYPE_VIDEO) |
06d63614eeaa
permit to specify the sizes of the decoders' buffers
nicodvb
parents:
21372
diff
changeset
|
1162 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
|
1163 else |
06d63614eeaa
permit to specify the sizes of the decoders' buffers
nicodvb
parents:
21372
diff
changeset
|
1164 bufsize = (conf_abuf_size ? conf_abuf_size : 4); |
06d63614eeaa
permit to specify the sizes of the decoders' buffers
nicodvb
parents:
21372
diff
changeset
|
1165 spriv->buffer_size = bufsize*1024; |
06d63614eeaa
permit to specify the sizes of the decoders' buffers
nicodvb
parents:
21372
diff
changeset
|
1166 } |
18192
0b77e66a7d32
introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents:
18187
diff
changeset
|
1167 |
0b77e66a7d32
introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents:
18187
diff
changeset
|
1168 if(priv->is_dvd && 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
|
1169 && 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
|
1170 dvd_pack = 1; |
0b77e66a7d32
introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents:
18187
diff
changeset
|
1171 |
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
|
1172 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
|
1173 { |
0b77e66a7d32
introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents:
18187
diff
changeset
|
1174 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
|
1175 return 0; |
0b77e66a7d32
introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents:
18187
diff
changeset
|
1176 } |
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
|
1177 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
|
1178 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
|
1179 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
|
1180 spriv->last_saved_pts = p.pts; |
18192
0b77e66a7d32
introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents:
18187
diff
changeset
|
1181 |
0b77e66a7d32
introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents:
18187
diff
changeset
|
1182 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
|
1183 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
|
1184 |
0b77e66a7d32
introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents:
18187
diff
changeset
|
1185 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
|
1186 { |
0b77e66a7d32
introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents:
18187
diff
changeset
|
1187 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
|
1188 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
|
1189 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
|
1190 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
|
1191 else |
0b77e66a7d32
introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents:
18187
diff
changeset
|
1192 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
|
1193 } |
0b77e66a7d32
introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents:
18187
diff
changeset
|
1194 |
0b77e66a7d32
introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents:
18187
diff
changeset
|
1195 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
|
1196 } |
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 |
0b77e66a7d32
introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents:
18187
diff
changeset
|
1199 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
|
1200 { |
0b77e66a7d32
introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents:
18187
diff
changeset
|
1201 if((spriv->dts && priv->scr >= spriv->dts) || priv->scr >= spriv->pts) |
0b77e66a7d32
introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents:
18187
diff
changeset
|
1202 mp_msg(MSGT_MUXER, MSGL_ERR, "\r\nERROR: scr %.3lf, dts %.3lf, pts %.3lf\r\n", (double) priv->scr/27000000.0, (double) spriv->dts/27000000.0, (double) spriv->pts/27000000.0); |
0b77e66a7d32
introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents:
18187
diff
changeset
|
1203 else if(priv->scr + 63000*300 < spriv->dts) |
0b77e66a7d32
introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents:
18187
diff
changeset
|
1204 mp_msg(MSGT_MUXER, MSGL_INFO, "\r\nWARNING>: scr %.3lf, dts %.3lf, pts %.3lf, diff %.3lf, piff %.3lf\r\n", (double) priv->scr/27000000.0, (double) spriv->dts/27000000.0, (double) spriv->pts/27000000.0, (double)(spriv->dts - priv->scr)/27000000.0, (double)(spriv->pts - priv->scr)/27000000.0); |
0b77e66a7d32
introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents:
18187
diff
changeset
|
1205 } |
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 n = 0; |
0b77e66a7d32
introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents:
18187
diff
changeset
|
1208 len = 0; |
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 frm = spriv->framebuf; |
0b77e66a7d32
introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents:
18187
diff
changeset
|
1211 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
|
1212 { |
0b77e66a7d32
introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents:
18187
diff
changeset
|
1213 if(!frm->pos) |
0b77e66a7d32
introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents:
18187
diff
changeset
|
1214 { |
0b77e66a7d32
introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents:
18187
diff
changeset
|
1215 //since iframes must always be aligned at block boundaries exit when we find the |
0b77e66a7d32
introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents:
18187
diff
changeset
|
1216 //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
|
1217 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
|
1218 { |
0b77e66a7d32
introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents:
18187
diff
changeset
|
1219 break; |
0b77e66a7d32
introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents:
18187
diff
changeset
|
1220 } |
0b77e66a7d32
introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents:
18187
diff
changeset
|
1221 spriv->frames++; |
0b77e66a7d32
introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents:
18187
diff
changeset
|
1222 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
|
1223 } |
0b77e66a7d32
introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents:
18187
diff
changeset
|
1224 |
21531
a90aa203186c
Get rid of min/max macros from aviheader.h, they do not belong here.
reimar
parents:
21486
diff
changeset
|
1225 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
|
1226 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
|
1227 |
0b77e66a7d32
introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents:
18187
diff
changeset
|
1228 len += m; |
0b77e66a7d32
introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents:
18187
diff
changeset
|
1229 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
|
1230 frm->pos += m; |
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 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
|
1233 { |
0b77e66a7d32
introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents:
18187
diff
changeset
|
1234 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
|
1235 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
|
1236 n++; |
0b77e66a7d32
introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents:
18187
diff
changeset
|
1237 frm++; |
0b77e66a7d32
introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents:
18187
diff
changeset
|
1238 } |
0b77e66a7d32
introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents:
18187
diff
changeset
|
1239 } |
0b77e66a7d32
introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents:
18187
diff
changeset
|
1240 |
21141 | 1241 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
|
1242 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
|
1243 |
0b77e66a7d32
introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents:
18187
diff
changeset
|
1244 spriv->size += len; |
0b77e66a7d32
introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents:
18187
diff
changeset
|
1245 |
0b77e66a7d32
introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents:
18187
diff
changeset
|
1246 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
|
1247 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
|
1248 |
0b77e66a7d32
introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents:
18187
diff
changeset
|
1249 if(n > 0) |
0b77e66a7d32
introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents:
18187
diff
changeset
|
1250 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
|
1251 |
0b77e66a7d32
introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents:
18187
diff
changeset
|
1252 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
|
1253 if(spriv->track_bufsize > spriv->max_buffer_size) |
23637 | 1254 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
|
1255 |
0b77e66a7d32
introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents:
18187
diff
changeset
|
1256 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
|
1257 fix_a52_headers(s); |
0b77e66a7d32
introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents:
18187
diff
changeset
|
1258 |
21141 | 1259 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
|
1260 { |
0b77e66a7d32
introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents:
18187
diff
changeset
|
1261 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
|
1262 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
|
1263 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
|
1264 } |
0b77e66a7d32
introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents:
18187
diff
changeset
|
1265 |
21660
ca9da45d13e9
muxers now write to output muxer->stream rather than to muxer->file
nicodvb
parents:
21544
diff
changeset
|
1266 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
|
1267 |
0b77e66a7d32
introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents:
18187
diff
changeset
|
1268 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
|
1269 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
|
1270 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
|
1271 |
0b77e66a7d32
introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents:
18187
diff
changeset
|
1272 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
|
1273 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
|
1274 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
|
1275 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
|
1276 priv->last_psm_scr = priv->scr; |
18192
0b77e66a7d32
introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents:
18187
diff
changeset
|
1277 |
0b77e66a7d32
introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents:
18187
diff
changeset
|
1278 return len; |
0b77e66a7d32
introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents:
18187
diff
changeset
|
1279 } |
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 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
|
1282 { |
0b77e66a7d32
introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents:
18187
diff
changeset
|
1283 int i, ndts; |
0b77e66a7d32
introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents:
18187
diff
changeset
|
1284 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
|
1285 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
|
1286 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
|
1287 pack_stats_t p; |
22929
a60dbae6ee1d
added :interleaving2, a better method to determine which stream whouls be flushed
nicodvb
parents:
22927
diff
changeset
|
1288 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
|
1289 |
0b77e66a7d32
introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents:
18187
diff
changeset
|
1290 ndts = -1; |
22929
a60dbae6ee1d
added :interleaving2, a better method to determine which stream whouls be flushed
nicodvb
parents:
22927
diff
changeset
|
1291 perc = -1; |
18192
0b77e66a7d32
introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents:
18187
diff
changeset
|
1292 |
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
|
1293 //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
|
1294 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
|
1295 { |
0b77e66a7d32
introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents:
18187
diff
changeset
|
1296 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
|
1297 |
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
|
1298 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
|
1299 get_packet_stats(priv, muxer->streams[i], &p, 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
|
1300 |
19cd9e0f8ac4
prevent buffer overflow in the STD; simplified fill_packet() (moving part of the code to get_packet_stats())
nicodvb
parents:
18558
diff
changeset
|
1301 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
|
1302 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
|
1303 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
|
1304 continue; |
0b77e66a7d32
introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents:
18187
diff
changeset
|
1305 |
0b77e66a7d32
introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents:
18187
diff
changeset
|
1306 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
|
1307 { |
0b77e66a7d32
introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents:
18187
diff
changeset
|
1308 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
|
1309 ndts = i; |
0b77e66a7d32
introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents:
18187
diff
changeset
|
1310 } |
22929
a60dbae6ee1d
added :interleaving2, a better method to determine which stream whouls be flushed
nicodvb
parents:
22927
diff
changeset
|
1311 |
a60dbae6ee1d
added :interleaving2, a better method to determine which stream whouls be flushed
nicodvb
parents:
22927
diff
changeset
|
1312 if(conf_interleaving2) |
a60dbae6ee1d
added :interleaving2, a better method to determine which stream whouls be flushed
nicodvb
parents:
22927
diff
changeset
|
1313 { |
a60dbae6ee1d
added :interleaving2, a better method to determine which stream whouls be flushed
nicodvb
parents:
22927
diff
changeset
|
1314 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
|
1315 if(sperc < perc) |
a60dbae6ee1d
added :interleaving2, a better method to determine which stream whouls be flushed
nicodvb
parents:
22927
diff
changeset
|
1316 { |
a60dbae6ee1d
added :interleaving2, a better method to determine which stream whouls be flushed
nicodvb
parents:
22927
diff
changeset
|
1317 ndts = i; |
a60dbae6ee1d
added :interleaving2, a better method to determine which stream whouls be flushed
nicodvb
parents:
22927
diff
changeset
|
1318 perc = sperc; |
a60dbae6ee1d
added :interleaving2, a better method to determine which stream whouls be flushed
nicodvb
parents:
22927
diff
changeset
|
1319 } |
a60dbae6ee1d
added :interleaving2, a better method to determine which stream whouls be flushed
nicodvb
parents:
22927
diff
changeset
|
1320 } |
18192
0b77e66a7d32
introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents:
18187
diff
changeset
|
1321 } |
0b77e66a7d32
introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents:
18187
diff
changeset
|
1322 |
0b77e66a7d32
introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents:
18187
diff
changeset
|
1323 return ndts; |
0b77e66a7d32
introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents:
18187
diff
changeset
|
1324 } |
0b77e66a7d32
introduced new functions to handle pack writing and interleaving strategy (will soon replace current ones)
nicodvb
parents:
18187
diff
changeset
|
1325 |
14753
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
1326 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
|
1327 { |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
1328 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
|
1329 { |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
1330 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
|
1331 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
|
1332 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
|
1333 } |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
1334 |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
1335 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
|
1336 { |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
1337 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
|
1338 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
|
1339 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
|
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 |
70c446099f40
new mpeg 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 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
|
1343 buf[7] = (buf[7] & 0x0f) | (priv->vaspect << 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
|
1344 |
70c446099f40
new mpeg 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 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
|
1346 buf[7] = (buf[7] & 0xf0) | priv->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
|
1347 |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
1348 if(priv->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
|
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[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
|
1351 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
|
1352 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
|
1353 } |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
1354 } |
70c446099f40
new mpeg 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 |
70c446099f40
new mpeg 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 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
|
1357 { //patches sequence display extension (display_horizontal_size and display_vertical_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
|
1358 //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
|
1359 int offset = 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
|
1360 |
70c446099f40
new mpeg 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(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
|
1362 offset += 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
|
1363 |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
1364 if(priv->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
|
1365 { |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
1366 buf[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
|
1367 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
|
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 |
70c446099f40
new mpeg 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 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
|
1371 |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
1372 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
|
1373 { |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
1374 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
|
1375 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
|
1376 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
|
1377 } |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
1378 } |
70c446099f40
new mpeg 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 |
70c446099f40
new mpeg 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 |
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
|
1381 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
|
1382 { |
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
|
1383 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
|
1384 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
|
1385 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
|
1386 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
|
1387 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
|
1388 |
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
|
1389 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
|
1390 |
f7f6984638f8
finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents:
18192
diff
changeset
|
1391 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
|
1392 { |
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
|
1393 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
|
1394 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
|
1395 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
|
1396 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
|
1397 } |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
1398 |
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
|
1399 mp_msg(MSGT_MUXER, MSGL_DBG2, "UPDATE SCR TO %"PRIu64" (%.3lf)\n", priv->scr, (double) (priv->scr/27000000.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
|
1400 |
f7f6984638f8
finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents:
18192
diff
changeset
|
1401 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
|
1402 { |
18196
f7f6984638f8
finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents:
18192
diff
changeset
|
1403 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
|
1404 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
|
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 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
|
1407 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
|
1408 { |
18196
f7f6984638f8
finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents:
18192
diff
changeset
|
1409 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
|
1410 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
|
1411 } |
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
|
1412 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
|
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 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
|
1415 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
|
1416 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
|
1417 priv->delta_scr = (uint64_t) (d * 27000000.0f); |
23637 | 1418 mp_msg(MSGT_MUXER, MSGL_INFO, "\r\nBUFFER UNDEFLOW at stream %d, raising muxrate to %d kb/s, delta_scr: %"PRIu64"\r\n", i, muxer->sysrate/125, priv->delta_scr); |
18196
f7f6984638f8
finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents:
18192
diff
changeset
|
1419 spriv->track_bufsize = 0; |
21448 | 1420 } |
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 if(j > 0) |
21448 | 1423 { |
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
|
1424 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
|
1425 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
|
1426 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
|
1427 spriv->buffer_track[j].size = 0; |
21448 | 1428 } |
14753
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
1429 |
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
|
1430 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
|
1431 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
|
1432 } |
14753
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
1433 } |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
1434 |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
1435 |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
1436 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
|
1437 { |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
1438 int n, found = 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
|
1439 |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
1440 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
|
1441 { |
70c446099f40
new mpeg 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 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
|
1443 //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
|
1444 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
|
1445 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
|
1446 { |
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
|
1447 mp_msg(MSGT_MUXER, MSGL_DBG2, "CALC_FRAMES, n=%d, type=%c, pts=%.3lf\n", n, FTYPE(vpriv->framebuf[n].type), (double)vpriv->framebuf[n].pts/27000000.0f); |
14753
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
1448 if(n+1 < vpriv->framebuf_used) |
18196
f7f6984638f8
finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents:
18192
diff
changeset
|
1449 mp_msg(MSGT_MUXER, MSGL_DBG2, "n+1=%d, type=%c, pts=%.3lf\n", n+1, FTYPE(vpriv->framebuf[n+1].type), (double)vpriv->framebuf[n+1].pts/27000000.0f); |
14753
70c446099f40
new mpeg 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 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
|
1452 { |
70c446099f40
new mpeg 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(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
|
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 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
|
1456 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
|
1457 } |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
1458 } |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
1459 |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
1460 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
|
1461 } |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
1462 } |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
1463 |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
1464 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
|
1465 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
|
1466 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
|
1467 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
|
1468 } |
70c446099f40
new mpeg 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 |
70c446099f40
new mpeg 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 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
|
1471 { |
18199 | 1472 int i, n, found; |
1473 int skip_cnt; | |
1474 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
|
1475 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
|
1476 muxer_headers_t *vpriv = NULL, *apriv = NULL; |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
1477 muxer_priv_t *priv = (muxer_priv_t *) muxer->priv; |
22909
94183c81ec0c
reversed r22879 until I discover why it's giving so many sync problems; I'll eventually recommit it in a fixed form
nicodvb
parents:
22881
diff
changeset
|
1478 double duration; |
94183c81ec0c
reversed r22879 until I discover why it's giving so many sync problems; I'll eventually recommit it in a fixed form
nicodvb
parents:
22881
diff
changeset
|
1479 uint64_t iduration, iaduration; |
14753
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
1480 |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
1481 /* |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
1482 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
|
1483 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
|
1484 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
|
1485 */ |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
1486 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
|
1487 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
|
1488 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
|
1489 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
|
1490 { |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
1491 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
|
1492 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
|
1493 { |
70c446099f40
new mpeg 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 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
|
1495 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
|
1496 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
|
1497 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
|
1498 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
|
1499 } |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
1500 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
|
1501 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
|
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 |
70c446099f40
new mpeg 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((! 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
|
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 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
|
1507 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
|
1508 } |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
1509 |
70c446099f40
new mpeg 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 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
|
1511 { |
15278
a45c7e1b998f
added support for AAC; moved most of MSGL_V to MSGL_DBG2 to reduce verbosity
nicodvb
parents:
15083
diff
changeset
|
1512 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
|
1513 |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
1514 vpriv = (muxer_headers_t*) vs->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
|
1515 |
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
|
1516 duration = 0; |
94183c81ec0c
reversed r22879 until I discover why it's giving so many sync problems; I'll eventually recommit it in a fixed form
nicodvb
parents:
22881
diff
changeset
|
1517 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
|
1518 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
|
1519 iduration += vpriv->framebuf[i].idur; |
94183c81ec0c
reversed r22879 until I discover why it's giving so many sync problems; I'll eventually recommit it in a fixed form
nicodvb
parents:
22881
diff
changeset
|
1520 duration = (double) (iduration / 27000000.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
|
1521 |
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
|
1522 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
|
1523 { |
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
|
1524 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
|
1525 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
|
1526 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
|
1527 { |
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 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
|
1529 } |
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 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
|
1531 { |
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 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
|
1533 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
|
1534 } |
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 } |
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 |
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
|
1537 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
|
1538 { |
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
|
1539 init_delay = vpriv->framebuf[0].pts - vpriv->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
|
1540 |
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
|
1541 for(i = 0; i < apriv->framebuf_cnt; i++) |
21448 | 1542 { |
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
|
1543 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
|
1544 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
|
1545 } |
f7f6984638f8
finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents:
18192
diff
changeset
|
1546 apriv->last_pts += init_delay; |
f7f6984638f8
finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents:
18192
diff
changeset
|
1547 mp_msg(MSGT_MUXER, MSGL_DBG2, "\r\nINITIAL VIDEO DELAY: %.3lf, currAPTS: %.3lf\r\n", (double) init_delay/27000000.0f, (double) apriv->last_pts/27000000.0f); |
14753
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
1548 } |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
1549 |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
1550 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
|
1551 vpriv->buffer_size = (conf_vbuf_size ? conf_vbuf_size : (priv->is_xvcd ? 46 : 230))*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
|
1552 |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
1553 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
|
1554 skip_cnt = 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
|
1555 |
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
|
1556 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
|
1557 { |
f7f6984638f8
finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents:
18192
diff
changeset
|
1558 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
|
1559 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
|
1560 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
|
1561 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
|
1562 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
|
1563 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
|
1564 |
18196
f7f6984638f8
finally replaced the old interleaving with the new one that respects buffering and [pd]ts<->scr constraints; don't check spriv->framebuf_used in find_best_stream()
nicodvb
parents:
18192
diff
changeset
|
1565 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
|
1566 { |
5ccb2b837b1c
if no stream could be muxed flush_buffers() returns 0: prevents while(1) stall at the end
nicodvb
parents:
20153
diff
changeset
|
1567 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
|
1568 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
|
1569 } |
14753
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
1570 } |
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
|
1571 } |
14753
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
1572 |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
1573 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
|
1574 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
|
1575 } |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
1576 |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
1577 |
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
|
1578 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
|
1579 { |
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
|
1580 // 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
|
1581 int d = (int)(fps*1001+0.5); |
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
|
1582 |
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
|
1583 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
|
1584 } |
70c446099f40
new mpeg 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 |
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
|
1586 |
21467 | 1587 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 | 1588 { |
17814 | 1589 if(! pce_ptr) |
1590 return 0; | |
14840 | 1591 if(fps_ptr != NULL) |
1592 { | |
21484 | 1593 *fps_ptr = (*fps_ptr & 0xf0) | priv->vframerate; |
1594 vpriv->nom_delta_pts = parse_fps(conf_vframerate); | |
14840 | 1595 } |
1596 | |
1597 //in pce_ptr starting from bit 0 bit 24 is tff, bit 30 is rff, | |
1598 if(pce_ptr[3] & 0x2) | |
1599 { | |
1600 mp_msg(MSGT_MUXER, MSGL_ERR, "\nERROR! RFF bit is already set, disabling telecining\n"); | |
1601 vpriv->telecine = 0; | |
1602 return 0; | |
1603 } | |
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
|
1604 |
14894 | 1605 vpriv->picture.progressive_sequence = 0; |
1606 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
|
1607 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
|
1608 se_ptr[1] &= 0xf7; |
14840 | 1609 |
24630
dcba95743b2f
1000l, the tff flag was never cleared before being overwritten with the value on bff_mask;
nicodvb
parents:
23637
diff
changeset
|
1610 //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
|
1611 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
|
1612 pce_ptr[4] |= 0x80; //sets progressive frame |
6fa1149d8c80
experimental film2pal and ntsc2pal soft teleciner
nicodvb
parents:
17591
diff
changeset
|
1613 |
21467 | 1614 vpriv->display_frame += n; |
14840 | 1615 if(! vpriv->vframes) |
21483 | 1616 mp_msg(MSGT_MUXER, MSGL_INFO, "\nENABLED SOFT TELECINING, FPS=%.3f\n",conf_vframerate); |
14840 | 1617 |
1618 return 1; | |
1619 } | |
1620 | |
14753
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
1621 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
|
1622 { |
14840 | 1623 uint8_t *fps_ptr = NULL; //pointer to the fps byte in the sequence header |
1624 uint8_t *se_ptr = NULL; //pointer to sequence extension | |
1625 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
|
1626 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
|
1627 int ret; |
22330 | 1628 int i, err; |
1629 uint32_t temp_ref; | |
1630 int pt; | |
14753
70c446099f40
new mpeg 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 |
15278
a45c7e1b998f
added support for AAC; moved most of MSGL_V to MSGL_DBG2 to reduce verbosity
nicodvb
parents:
15083
diff
changeset
|
1632 mp_msg(MSGT_MUXER, MSGL_DBG2,"parse_mpeg12_video, len=%u\n", (uint32_t) 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
|
1633 if(s->buffer[0] != 0 || s->buffer[1] != 0 || s->buffer[2] != 1 || 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
|
1634 { |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
1635 mp_msg(MSGT_MUXER, MSGL_ERR,"Unknown video format, possibly non-MPEG1/2 stream, len=%d!\n", len); |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
1636 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
|
1637 } |
22330 | 1638 |
1639 temp_ref = 0; | |
1640 pt = 0; | |
1641 err = 0; | |
1642 i = 0; | |
1643 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
|
1644 { // Video (0) Sequence header (b3) or GOP (b8) |
22330 | 1645 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
|
1646 { |
22330 | 1647 switch(s->buffer[i+3]) |
14840 | 1648 { |
22330 | 1649 case 0xb3: //sequence |
1650 { | |
1651 if(i + 11 > len) | |
1652 { | |
1653 err=1; | |
1654 break; | |
1655 } | |
1656 fps_ptr = &(s->buffer[i+7]); | |
1657 mp_header_process_sequence_header(&(spriv->picture), &(s->buffer[i+4])); | |
1658 spriv->delta_pts = spriv->nom_delta_pts = parse_fps(spriv->picture.fps); | |
1659 | |
1660 spriv->delta_clock = (double) 1/fps; | |
1661 //the 2 lines below are needed to handle non-standard frame rates (such as 18) | |
1662 if(! spriv->delta_pts) | |
1663 spriv->delta_pts = spriv->nom_delta_pts = (uint64_t) ((double)27000000.0 * spriv->delta_clock ); | |
1664 mp_msg(MSGT_MUXER, MSGL_DBG2, "\nFPS: %.3f, FRAMETIME: %.3lf\n", fps, (double)1/fps); | |
1665 if(priv->patch_seq) | |
1666 patch_seq(priv, &(s->buffer[i])); | |
1667 } | |
1668 break; | |
1669 | |
1670 case 0xb5: | |
1671 if(i + 9 > len) | |
1672 { | |
1673 err = 1; | |
1674 break; | |
1675 } | |
1676 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
|
1677 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
|
1678 se_ptr = &(s->buffer[i+4]); |
22330 | 1679 if(((s->buffer[i+4] & 0xf0) == 0x20)) |
1680 { | |
1681 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
|
1682 patch_panscan(priv, &(s->buffer[i+4])); |
22330 | 1683 } |
1684 if((s->buffer[i+4] & 0xf0) == 0x80) | |
1685 { | |
1686 pce_ptr = &(s->buffer[i+4]); | |
1687 } | |
1688 break; | |
14753
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
1689 |
22330 | 1690 case 0xb8: |
1691 gop_reset = 1; | |
1692 break; | |
14753
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
1693 |
22330 | 1694 case 0x00: |
1695 if(i + 5 > len) | |
1696 { | |
1697 err = 1; | |
1698 break; | |
1699 } | |
1700 pt = (s->buffer[i+5] & 0x1c) >> 3; | |
1701 temp_ref = (s->buffer[i+4]<<2)+(s->buffer[i+5]>>6); | |
1702 break; | |
1703 } | |
1704 if(err) break; //something went wrong | |
1705 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
|
1706 } |
22330 | 1707 i++; |
1708 } | |
1709 if(err) | |
1710 mp_msg(MSGT_MUXER, MSGL_ERR,"Warning: picture too short or broken!\n"); | |
1711 | |
22332 | 1712 //following 2 lines are workaround: lavf doesn't sync to sequence headers before passing demux_packets |
1713 if(!spriv->nom_delta_pts) | |
1714 spriv->delta_pts = spriv->nom_delta_pts = parse_fps(fps); | |
1715 if(!spriv->vframes) | |
1716 spriv->last_tr = spriv->max_tr = temp_ref; | |
1717 d1 = temp_ref - spriv->last_tr; | |
1718 if(gop_reset) | |
1719 frames_diff = spriv->max_tr + 1 + temp_ref - spriv->last_tr; | |
1720 else | |
1721 { | |
1722 if(d1 < -6) //there's a wraparound | |
1723 frames_diff = spriv->max_tr + 1 + temp_ref - spriv->last_tr; | |
1724 else if(d1 > 6) //there's a wraparound | |
1725 frames_diff = spriv->max_tr + 1 + spriv->last_tr - temp_ref; | |
1726 else if(!d1) //pre-emptive fix against broken sequences | |
1727 frames_diff = 1; | |
1728 else | |
1729 frames_diff = d1; | |
1730 } | |
1731 mp_msg(MSGT_MUXER, MSGL_DBG2, "\nLAST: %d, TR: %d, GOP: %d, DIFF: %d, MAX: %d, d1: %d\n", | |
1732 spriv->last_tr, temp_ref, gop_reset, frames_diff, spriv->max_tr, d1); | |
1733 | |
1734 if(temp_ref > spriv->max_tr || gop_reset) | |
1735 spriv->max_tr = temp_ref; | |
1736 | |
1737 spriv->last_tr = temp_ref; | |
1738 if(spriv->picture.mpeg1 == 0) | |
1739 { | |
1740 if(spriv->telecine && pce_ptr) | |
1741 { | |
1742 soft_telecine(priv, spriv, fps_ptr, se_ptr, pce_ptr, frames_diff); | |
1743 spriv->picture.display_time = 100; | |
1744 mp_header_process_extension(&(spriv->picture), pce_ptr); | |
1745 if(spriv->picture.display_time >= 50 && spriv->picture.display_time <= 300) | |
1746 spriv->delta_pts = (spriv->nom_delta_pts * spriv->picture.display_time) / 100; | |
1747 } | |
1748 } | |
1749 | |
1750 if(! spriv->vframes) | |
1751 frames_diff = 1; | |
1752 | |
1753 spriv->last_dts += spriv->delta_pts; | |
1754 spriv->last_pts += spriv->nom_delta_pts*(frames_diff-1) + spriv->delta_pts; | |
1755 | |
1756 ret = add_frame(spriv, spriv->delta_pts, s->buffer, len, pt, spriv->last_dts, spriv->last_pts); | |
1757 if(ret < 0) | |
1758 { | |
1759 mp_msg(MSGT_MUXER, MSGL_FATAL, "\r\nPARSE_MPEG12: add_frames(%d) failed, exit\r\n", len); | |
1760 return 0; | |
1761 } | |
1762 mp_msg(MSGT_MUXER, MSGL_DBG2, "\r\nVIDEO FRAME, PT: %C, tr: %d, diff: %d, dts: %.3lf, pts: %.3lf, pdt: %u, gop_reset: %d\r\n", | |
1763 ftypes[pt], temp_ref, frames_diff, ((double) spriv->last_dts/27000000.0f), | |
1764 ((double) spriv->last_pts/27000000.0f), spriv->picture.display_time, gop_reset); | |
1765 | |
1766 if(pt == B_FRAME) | |
1767 { | |
1768 int j, n, adj = 0; | |
1769 int64_t diff = spriv->last_dts - spriv->last_pts; | |
1770 | |
1771 if(diff != 0) | |
1772 { | |
1773 n = spriv->framebuf_used - 1; | |
1774 | |
1775 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
|
1776 { |
22332 | 1777 if(spriv->framebuf[j].pts >= spriv->last_pts) |
14894 | 1778 { |
22332 | 1779 spriv->framebuf[j].pts += diff; |
1780 adj++; | |
14894 | 1781 } |
1782 } | |
23637 | 1783 mp_msg(MSGT_MUXER, MSGL_V, "\r\nResynced B-frame by %d units, DIFF: %"PRId64" (%.3lf),[pd]ts=%.3lf\r\n", |
22332 | 1784 n, diff, (double) diff/27000000.0f, (double) spriv->last_pts/27000000.0f); |
1785 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
|
1786 } |
22332 | 1787 } |
1788 spriv->vframes++; | |
14753
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
1789 |
15278
a45c7e1b998f
added support for AAC; moved most of MSGL_V to MSGL_DBG2 to reduce verbosity
nicodvb
parents:
15083
diff
changeset
|
1790 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
|
1791 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
|
1792 } |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
1793 |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
1794 |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
1795 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
|
1796 { |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
1797 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
|
1798 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
|
1799 |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
1800 mn = mx = vpriv->framebuf[0].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
|
1801 for(i = 0; i < 3; 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
|
1802 { |
16750
0a31740dd5e6
Use PRI?64 defines as format strings for 64 bit variables.
reimar
parents:
16192
diff
changeset
|
1803 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
|
1804 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
|
1805 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
|
1806 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
|
1807 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
|
1808 } |
70c446099f40
new mpeg 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 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
|
1810 for(i=0; i<3; 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
|
1811 { |
70c446099f40
new mpeg 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 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
|
1813 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
|
1814 } |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
1815 |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
1816 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
|
1817 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
|
1818 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
|
1819 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
|
1820 |
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
|
1821 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
|
1822 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
|
1823 { |
70c446099f40
new mpeg 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 for(i=0; i<3; 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
|
1825 { |
70c446099f40
new mpeg 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 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
|
1827 vpriv->framebuf[i].dts += i * diff; |
15278
a45c7e1b998f
added support for AAC; moved most of MSGL_V to MSGL_DBG2 to reduce verbosity
nicodvb
parents:
15083
diff
changeset
|
1828 mp_msg(MSGT_MUXER, MSGL_DBG2, "FIXED_PTS: %.3lf, FIXED_DTS: %.3lf\n", |
18161
516d7874450b
changed timebase from 1024 to 300 (no rounding errors with any of the allowed framerates); write scr_extension accordingly. This is the first of a long series of patches to rewrite the muxer
nicodvb
parents:
18044
diff
changeset
|
1829 (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
|
1830 } |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
1831 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
|
1832 } |
70c446099f40
new mpeg 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 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
|
1834 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
|
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 |
70c446099f40
new mpeg 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 |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
1838 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
|
1839 { |
70c446099f40
new mpeg 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 size_t ptr = 0; |
17815 | 1841 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
|
1842 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
|
1843 int ret; |
14753
70c446099f40
new mpeg 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 |
15278
a45c7e1b998f
added support for AAC; moved most of MSGL_V to MSGL_DBG2 to reduce verbosity
nicodvb
parents:
15083
diff
changeset
|
1845 mp_msg(MSGT_MUXER, MSGL_DBG2,"parse_mpeg4_video, len=%u\n", (uint32_t) 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
|
1846 if(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
|
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 mp_msg(MSGT_MUXER, MSGL_ERR,"Frame too short: %d, exit!\n", len); |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
1849 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
|
1850 } |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
1851 |
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
|
1852 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
|
1853 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
|
1854 { |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
1855 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
|
1856 { |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
1857 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
|
1858 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
|
1859 } |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
1860 |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
1861 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
|
1862 { |
70c446099f40
new mpeg 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 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
|
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 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
|
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 //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
|
1868 } |
70c446099f40
new mpeg 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 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
|
1870 { |
70c446099f40
new mpeg 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 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
|
1872 mp4_header_process_vop(&(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
|
1873 |
70c446099f40
new mpeg 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 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
|
1875 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
|
1876 delta -= vpriv->picture.timeinc_resolution; |
18163
1e4caa08161d
fixed wrong operator precedence in parse_mpeg4_video()
nicodvb
parents:
18162
diff
changeset
|
1877 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
|
1878 delta += vpriv->picture.timeinc_resolution; |
70c446099f40
new mpeg 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 |
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
|
1880 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
|
1881 //warning, it seems that packed bops can lead to delta == 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
|
1882 |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
1883 pt = vpriv->picture.picture_type + 1; |
16750
0a31740dd5e6
Use PRI?64 defines as format strings for 64 bit variables.
reimar
parents:
16192
diff
changeset
|
1884 mp_msg(MSGT_MUXER, MSGL_DBG2, "\nTYPE: %c, RESOLUTION: %d, TEMP: %d, delta: %d, delta_pts: %"PRId64" = %.3lf, delta2: %.3lf\n", |
18161
516d7874450b
changed timebase from 1024 to 300 (no rounding errors with any of the allowed framerates); write scr_extension accordingly. This is the first of a long series of patches to rewrite the muxer
nicodvb
parents:
18044
diff
changeset
|
1885 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
|
1886 (double) delta / (double) vpriv->picture.timeinc_resolution); |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
1887 |
70c446099f40
new mpeg 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 vpriv->last_tr = vpriv->picture.timeinc_unit; |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
1889 |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
1890 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
|
1891 } |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
1892 |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
1893 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
|
1894 } |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
1895 |
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
|
1896 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
|
1897 { |
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
|
1898 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
|
1899 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
|
1900 } |
14753
70c446099f40
new mpeg 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 |
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
|
1902 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
|
1903 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
|
1904 { |
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
|
1905 mp_msg(MSGT_MUXER, MSGL_FATAL, "\r\nPARSE_MPEG4: add_frames(%d) failed, exit\r\n", len); |
18181
afaa492536f6
new code to simplify assignment of timestamps; removed temp_ref from mpeg_frame_t and modified add_frame() accordingly; removed no more used drop_delayed_audio() and save_delayed_audio()
nicodvb
parents:
18166
diff
changeset
|
1906 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
|
1907 } |
14753
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
1908 |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
1909 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
|
1910 { |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
1911 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
|
1912 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
|
1913 { |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
1914 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
|
1915 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
|
1916 vpriv->delta_clock = ((double) vpriv->frame_duration)/27000000.0; |
16750
0a31740dd5e6
Use PRI?64 defines as format strings for 64 bit variables.
reimar
parents:
16192
diff
changeset
|
1917 mp_msg(MSGT_MUXER, MSGL_INFO, "FRAME DURATION: %"PRIu64" %.3lf\n", |
18161
516d7874450b
changed timebase from 1024 to 300 (no rounding errors with any of the allowed framerates); write scr_extension accordingly. This is the first of a long series of patches to rewrite the muxer
nicodvb
parents:
18044
diff
changeset
|
1918 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
|
1919 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
|
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 } |
70c446099f40
new mpeg 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 |
15278
a45c7e1b998f
added support for AAC; moved most of MSGL_V to MSGL_DBG2 to reduce verbosity
nicodvb
parents:
15083
diff
changeset
|
1923 mp_msg(MSGT_MUXER, MSGL_DBG2, "LAST_PTS: %.3lf, LAST_DTS: %.3lf\n", |
18161
516d7874450b
changed timebase from 1024 to 300 (no rounding errors with any of the allowed framerates); write scr_extension accordingly. This is the first of a long series of patches to rewrite the muxer
nicodvb
parents:
18044
diff
changeset
|
1924 (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
|
1925 |
afaa492536f6
new code to simplify assignment of timestamps; removed temp_ref from mpeg_frame_t and modified add_frame() accordingly; removed no more used drop_delayed_audio() and save_delayed_audio()
nicodvb
parents:
18166
diff
changeset
|
1926 vpriv->vframes++; |
14753
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
1927 |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
1928 return len; |
8585 | 1929 } |
1930 | |
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
|
1931 |
e3d7f52776ff
added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents:
15278
diff
changeset
|
1932 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
|
1933 { |
e3d7f52776ff
added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents:
15278
diff
changeset
|
1934 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
|
1935 |
e3d7f52776ff
added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents:
15278
diff
changeset
|
1936 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
|
1937 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
|
1938 |
e3d7f52776ff
added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents:
15278
diff
changeset
|
1939 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
|
1940 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
|
1941 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
|
1942 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
|
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 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
|
1945 { |
18558
4928dd61f136
Fix potential integer overflows in memory allocation.
rtogni
parents:
18249
diff
changeset
|
1946 if(spriv->framebuf[idx].size > SIZE_MAX - (size_t)len) |
4928dd61f136
Fix potential integer overflows in memory allocation.
rtogni
parents:
18249
diff
changeset
|
1947 return 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
|
1948 spriv->framebuf[idx].buffer = (uint8_t*) 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
|
1949 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
|
1950 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
|
1951 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
|
1952 } |
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 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
|
1955 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
|
1956 |
e3d7f52776ff
added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents:
15278
diff
changeset
|
1957 return 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
|
1958 } |
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 |
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
|
1960 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
|
1961 { |
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
|
1962 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
|
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 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
|
1965 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
|
1966 { |
18558
4928dd61f136
Fix potential integer overflows in memory allocation.
rtogni
parents:
18249
diff
changeset
|
1967 spriv->framebuf = (mpeg_frame_t*) 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
|
1968 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
|
1969 { |
e3d7f52776ff
added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents:
15278
diff
changeset
|
1970 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
|
1971 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
|
1972 } |
e3d7f52776ff
added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents:
15278
diff
changeset
|
1973 |
e3d7f52776ff
added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents:
15278
diff
changeset
|
1974 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
|
1975 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
|
1976 spriv->framebuf[spriv->framebuf_cnt].pos = 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
|
1977 |
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 spriv->framebuf[spriv->framebuf_cnt].buffer = (uint8_t*) malloc(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
|
1979 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
|
1980 { |
e3d7f52776ff
added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents:
15278
diff
changeset
|
1981 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
|
1982 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
|
1983 } |
e3d7f52776ff
added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents:
15278
diff
changeset
|
1984 spriv->framebuf[spriv->framebuf_cnt].alloc_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
|
1985 spriv->framebuf_cnt++; |
e3d7f52776ff
added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents:
15278
diff
changeset
|
1986 } |
e3d7f52776ff
added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents:
15278
diff
changeset
|
1987 |
e3d7f52776ff
added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents:
15278
diff
changeset
|
1988 if(spriv->framebuf[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
|
1989 { |
18558
4928dd61f136
Fix potential integer overflows in memory allocation.
rtogni
parents:
18249
diff
changeset
|
1990 if(spriv->framebuf[idx].size > SIZE_MAX - (size_t)len) |
4928dd61f136
Fix potential integer overflows in memory allocation.
rtogni
parents:
18249
diff
changeset
|
1991 { |
4928dd61f136
Fix potential integer overflows in memory allocation.
rtogni
parents:
18249
diff
changeset
|
1992 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
|
1993 return -1; |
4928dd61f136
Fix potential integer overflows in memory allocation.
rtogni
parents:
18249
diff
changeset
|
1994 } |
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[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
|
1996 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
|
1997 { |
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 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
|
1999 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
|
2000 } |
e3d7f52776ff
added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents:
15278
diff
changeset
|
2001 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
|
2002 } |
e3d7f52776ff
added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents:
15278
diff
changeset
|
2003 |
e3d7f52776ff
added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents:
15278
diff
changeset
|
2004 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
|
2005 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 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
|
2007 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
|
2008 |
e3d7f52776ff
added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents:
15278
diff
changeset
|
2009 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
|
2010 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
|
2011 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
|
2012 spriv->framebuf_used++; |
23637 | 2013 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
|
2014 |
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
|
2015 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
|
2016 } |
e3d7f52776ff
added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents:
15278
diff
changeset
|
2017 |
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
|
2018 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
|
2019 { |
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
|
2020 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
|
2021 int score[4] = {0, 0, 0, 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
|
2022 |
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
|
2023 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
|
2024 { |
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
|
2025 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
|
2026 { |
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
|
2027 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
|
2028 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
|
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 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
|
2031 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
|
2032 } |
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 } |
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 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
|
2035 } |
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 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
|
2038 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
|
2039 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
|
2040 { |
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 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
|
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 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
|
2044 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
|
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 |
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 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
|
2049 } |
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
|
2050 |
e3d7f52776ff
added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents:
15278
diff
changeset
|
2051 extern int aac_parse_frame(uint8_t *buf, int *srate, int *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
|
2052 |
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
|
2053 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
|
2054 { |
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
|
2055 int i, j, len, chans, srate, spf, layer, dummy, tot, num, frm_idx; |
18238 | 2056 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
|
2057 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
|
2058 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
|
2059 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
|
2060 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
|
2061 |
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 i = tot = frames = 0; |
18238 | 2063 finished = 0; |
2064 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
|
2065 { |
18238 | 2066 len = 0; |
2067 switch(s->wf->wFormatTag) | |
2068 { | |
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
|
2069 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
|
2070 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
|
2071 { |
18238 | 2072 if(i + 3 >= s->b_buffer_len) |
2073 { | |
2074 finished = 1; | |
2075 break; | |
2076 } | |
2077 | |
15947
e3d7f52776ff
added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents:
15278
diff
changeset
|
2078 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
|
2079 { |
16162
b5c2254d13f8
set i_bps in demux_audio for WAV and MP3 to avoid division by zero before
reimar
parents:
15947
diff
changeset
|
2080 len = mp_get_mp3_header(&(s->b_buffer[i]), &chans, &srate, &spf, &layer, NULL); |
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
|
2081 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
|
2082 && 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
|
2083 { |
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
|
2084 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
|
2085 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
|
2086 } |
18238 | 2087 else |
2088 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
|
2089 } |
e3d7f52776ff
added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents:
15278
diff
changeset
|
2090 } |
e3d7f52776ff
added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents:
15278
diff
changeset
|
2091 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
|
2092 |
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 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
|
2094 { |
18238 | 2095 if(i + 6 >= s->b_buffer_len) |
2096 { | |
2097 finished = 1; | |
2098 break; | |
2099 } | |
2100 | |
15947
e3d7f52776ff
added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents:
15278
diff
changeset
|
2101 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
|
2102 { |
17493
f71e678e6216
use mp_a52_framesize() when liba52 is not available
nicodvb
parents:
17487
diff
changeset
|
2103 srate = 0; |
f71e678e6216
use mp_a52_framesize() when liba52 is not available
nicodvb
parents:
17487
diff
changeset
|
2104 #ifdef USE_LIBA52 |
15947
e3d7f52776ff
added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents:
15278
diff
changeset
|
2105 len = a52_syncinfo(&(s->b_buffer[i]), &dummy, &srate, &dummy); |
17493
f71e678e6216
use mp_a52_framesize() when liba52 is not available
nicodvb
parents:
17487
diff
changeset
|
2106 #else |
f71e678e6216
use mp_a52_framesize() when liba52 is not available
nicodvb
parents:
17487
diff
changeset
|
2107 len = mp_a52_framesize(&(s->b_buffer[i]), &srate); |
f71e678e6216
use mp_a52_framesize() when liba52 is not available
nicodvb
parents:
17487
diff
changeset
|
2108 #endif |
15947
e3d7f52776ff
added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents:
15278
diff
changeset
|
2109 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
|
2110 { |
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
|
2111 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
|
2112 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
|
2113 } |
18238 | 2114 else |
2115 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
|
2116 } |
e3d7f52776ff
added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents:
15278
diff
changeset
|
2117 } |
e3d7f52776ff
added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents:
15278
diff
changeset
|
2118 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
|
2119 |
e3d7f52776ff
added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents:
15278
diff
changeset
|
2120 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
|
2121 case AUDIO_AAC2: |
e3d7f52776ff
added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents:
15278
diff
changeset
|
2122 { |
18238 | 2123 if(i + 7 >= s->b_buffer_len) |
2124 { | |
2125 finished = 1; | |
2126 break; | |
2127 } | |
2128 | |
15947
e3d7f52776ff
added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents:
15278
diff
changeset
|
2129 if(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
|
2130 { |
e3d7f52776ff
added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents:
15278
diff
changeset
|
2131 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
|
2132 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
|
2133 { |
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
|
2134 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
|
2135 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
|
2136 } |
18238 | 2137 else |
2138 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
|
2139 } |
e3d7f52776ff
added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents:
15278
diff
changeset
|
2140 } |
e3d7f52776ff
added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents:
15278
diff
changeset
|
2141 } |
18238 | 2142 |
2143 if(finished) | |
2144 break; | |
2145 | |
2146 if(!len) | |
2147 { | |
2148 i++; | |
2149 continue; | |
2150 } | |
2151 | |
2152 spriv->timer += dur; | |
2153 if(spriv->drop_delayed_frames && delay < 0 && spriv->timer <= -delay) | |
2154 { | |
2155 i += len; | |
2156 tot = i; | |
2157 continue; | |
2158 } | |
2159 | |
2160 frames++; | |
2161 fill_last_frame(spriv, &(s->b_buffer[tot]), i - tot); | |
2162 frm_idx = add_frame(spriv, idur, &(s->b_buffer[i]), len, 0, spriv->last_pts, spriv->last_pts); | |
2163 if(frm_idx < 0) | |
2164 { | |
2165 mp_msg(MSGT_MUXER, MSGL_FATAL, "Couldn't add audio frame buffer(frame), abort\n"); | |
2166 goto audio_exit; | |
2167 } | |
2168 for(j = frm_idx; j < spriv->framebuf_cnt; j++) | |
2169 spriv->framebuf[j].pts = spriv->last_pts; | |
2170 spriv->last_pts += idur; | |
2171 | |
2172 i += len; | |
2173 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
|
2174 } |
e3d7f52776ff
added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents:
15278
diff
changeset
|
2175 |
18238 | 2176 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
|
2177 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
|
2178 { |
e3d7f52776ff
added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents:
15278
diff
changeset
|
2179 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
|
2180 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
|
2181 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
|
2182 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
|
2183 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
|
2184 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
|
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 |
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 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
|
2188 { |
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
|
2189 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
|
2190 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
|
2191 { |
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
|
2192 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
|
2193 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
|
2194 } |
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 } |
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
|
2196 |
15947
e3d7f52776ff
added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents:
15278
diff
changeset
|
2197 *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
|
2198 *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
|
2199 |
e3d7f52776ff
added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents:
15278
diff
changeset
|
2200 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
|
2201 } |
e3d7f52776ff
added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents:
15278
diff
changeset
|
2202 |
18183
ac03acb92d24
introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents:
18181
diff
changeset
|
2203 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
|
2204 { |
ac03acb92d24
introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents:
18181
diff
changeset
|
2205 muxer_headers_t *spriv = stream->priv; |
ac03acb92d24
introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents:
18181
diff
changeset
|
2206 muxer_t *muxer = stream->muxer; |
ac03acb92d24
introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents:
18181
diff
changeset
|
2207 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
|
2208 uint32_t stream_format; |
24909
55c96e871198
10l, priv->use_psm can be 1 only if the format is genmpeg2
nicodvb
parents:
24908
diff
changeset
|
2209 int needs_psm = 0; |
18183
ac03acb92d24
introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents:
18181
diff
changeset
|
2210 |
ac03acb92d24
introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents:
18181
diff
changeset
|
2211 if(stream->type == MUXER_TYPE_AUDIO) |
ac03acb92d24
introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents:
18181
diff
changeset
|
2212 { |
24905
170dcb44069a
moved to fix_parameters() the code that decides if the PSM is needed
nicodvb
parents:
24904
diff
changeset
|
2213 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
|
2214 spriv->is_ready = 1; |
21413
06d63614eeaa
permit to specify the sizes of the decoders' buffers
nicodvb
parents:
21372
diff
changeset
|
2215 if(conf_abuf_size) |
06d63614eeaa
permit to specify the sizes of the decoders' buffers
nicodvb
parents:
21372
diff
changeset
|
2216 spriv->max_buffer_size = conf_abuf_size*1024; |
06d63614eeaa
permit to specify the sizes of the decoders' buffers
nicodvb
parents:
21372
diff
changeset
|
2217 else |
18183
ac03acb92d24
introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents:
18181
diff
changeset
|
2218 spriv->max_buffer_size = 4*1024; |
ac03acb92d24
introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents:
18181
diff
changeset
|
2219 if(stream->wf->wFormatTag == AUDIO_A52) |
ac03acb92d24
introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents:
18181
diff
changeset
|
2220 { |
ac03acb92d24
introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents:
18181
diff
changeset
|
2221 stream->ckid = be2me_32 (0x1bd); |
ac03acb92d24
introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents:
18181
diff
changeset
|
2222 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
|
2223 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
|
2224 spriv->id = 0xbd; |
21413
06d63614eeaa
permit to specify the sizes of the decoders' buffers
nicodvb
parents:
21372
diff
changeset
|
2225 if(!conf_abuf_size) |
18183
ac03acb92d24
introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents:
18181
diff
changeset
|
2226 spriv->max_buffer_size = 16*1024; |
ac03acb92d24
introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents:
18181
diff
changeset
|
2227 } |
ac03acb92d24
introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents:
18181
diff
changeset
|
2228 else if(stream->wf->wFormatTag == AUDIO_AAC1 || stream->wf->wFormatTag == AUDIO_AAC2) |
24909
55c96e871198
10l, priv->use_psm can be 1 only if the format is genmpeg2
nicodvb
parents:
24908
diff
changeset
|
2229 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
|
2230 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
|
2231 spriv->is_ready = 0; |
18183
ac03acb92d24
introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents:
18181
diff
changeset
|
2232 } |
ac03acb92d24
introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents:
18181
diff
changeset
|
2233 else //video |
ac03acb92d24
introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents:
18181
diff
changeset
|
2234 { |
24905
170dcb44069a
moved to fix_parameters() the code that decides if the PSM is needed
nicodvb
parents:
24904
diff
changeset
|
2235 stream_format = stream->bih->biCompression; |
21413
06d63614eeaa
permit to specify the sizes of the decoders' buffers
nicodvb
parents:
21372
diff
changeset
|
2236 if(conf_vbuf_size) |
06d63614eeaa
permit to specify the sizes of the decoders' buffers
nicodvb
parents:
21372
diff
changeset
|
2237 spriv->max_buffer_size = conf_vbuf_size*1024; |
06d63614eeaa
permit to specify the sizes of the decoders' buffers
nicodvb
parents:
21372
diff
changeset
|
2238 else |
06d63614eeaa
permit to specify the sizes of the decoders' buffers
nicodvb
parents:
21372
diff
changeset
|
2239 { |
24902
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2240 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
|
2241 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
|
2242 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
|
2243 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
|
2244 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
|
2245 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
|
2246 else |
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2247 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
|
2248 } |
18183
ac03acb92d24
introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents:
18181
diff
changeset
|
2249 |
ac03acb92d24
introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents:
18181
diff
changeset
|
2250 if(is_mpeg4(stream->bih->biCompression)) |
ac03acb92d24
introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents:
18181
diff
changeset
|
2251 spriv->is_ready = 0; |
ac03acb92d24
introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents:
18181
diff
changeset
|
2252 else |
ac03acb92d24
introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents:
18181
diff
changeset
|
2253 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
|
2254 |
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
|
2255 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
|
2256 needs_psm = 1; |
18183
ac03acb92d24
introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents:
18181
diff
changeset
|
2257 } |
24905
170dcb44069a
moved to fix_parameters() the code that decides if the PSM is needed
nicodvb
parents:
24904
diff
changeset
|
2258 |
24909
55c96e871198
10l, priv->use_psm can be 1 only if the format is genmpeg2
nicodvb
parents:
24908
diff
changeset
|
2259 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
|
2260 { |
24909
55c96e871198
10l, priv->use_psm can be 1 only if the format is genmpeg2
nicodvb
parents:
24908
diff
changeset
|
2261 priv->use_psm = 1; |
24905
170dcb44069a
moved to fix_parameters() the code that decides if the PSM is needed
nicodvb
parents:
24904
diff
changeset
|
2262 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
|
2263 priv->psm_streams_cnt++; |
170dcb44069a
moved to fix_parameters() the code that decides if the PSM is needed
nicodvb
parents:
24904
diff
changeset
|
2264 } |
18183
ac03acb92d24
introduced structures and code to keep track of decoder's buffers sizes
nicodvb
parents:
18181
diff
changeset
|
2265 } |
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
|
2266 |
e3d7f52776ff
added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents:
15278
diff
changeset
|
2267 |
24902
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2268 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
|
2269 { |
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2270 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
|
2271 uint64_t tmp; |
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2272 muxer_t *muxer = s->muxer; |
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2273 muxer_priv_t *priv = (muxer_priv_t *)muxer->priv; |
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2274 muxer_headers_t *spriv = (muxer_headers_t*) s->priv; |
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2275 float fps; |
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2276 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
|
2277 |
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2278 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
|
2279 return; |
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2280 |
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2281 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
|
2282 { // 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
|
2283 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
|
2284 spriv->type = 1; |
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2285 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
|
2286 if(! spriv->vframes) |
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2287 { |
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2288 spriv->last_dts = spriv->last_pts - (uint64_t)(27000000.0f/fps); |
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2289 mp_msg(MSGT_MUXER, MSGL_INFO,"INITV: %.3lf, %.3lf, fps: %.3f\r\n", (double) spriv->last_pts/27000000.0f, (double) spriv->last_dts/27000000.0f, fps); |
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2290 } |
21448 | 2291 |
24902
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2292 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
|
2293 { |
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2294 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
|
2295 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
|
2296 if(len) |
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2297 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
|
2298 else |
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2299 { |
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2300 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
|
2301 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
|
2302 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
|
2303 } |
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2304 } |
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2305 else if(is_mpeg4(stream_format)) |
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2306 { |
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2307 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
|
2308 spriv->telecine = 0; |
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2309 if(len) |
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2310 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
|
2311 else |
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2312 { |
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2313 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
|
2314 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
|
2315 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
|
2316 } |
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2317 } |
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2318 |
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2319 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
|
2320 } |
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2321 else |
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2322 { // MUXER_TYPE_AUDIO |
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2323 double fake_timer; |
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2324 spriv->type = 0; |
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2325 stream_format = s->wf->wFormatTag; |
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2326 |
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2327 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
|
2328 { |
24910 | 2329 void *tmp; |
2330 | |
24902
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2331 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
|
2332 { |
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2333 mp_msg(MSGT_MUXER, MSGL_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
|
2334 return; |
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2335 } |
24910 | 2336 tmp = realloc(s->b_buffer, len + s->b_buffer_len); |
2337 if(!tmp) | |
24902
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2338 { |
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2339 mp_msg(MSGT_MUXER, MSGL_FATAL, "\nFATAL! couldn't realloc %d bytes\n", len + s->b_buffer_len); |
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2340 return; |
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2341 } |
24910 | 2342 s->b_buffer = tmp; |
24902
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2343 |
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2344 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
|
2345 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
|
2346 } |
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2347 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
|
2348 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
|
2349 |
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2350 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
|
2351 { |
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2352 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
|
2353 { |
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2354 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
|
2355 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
|
2356 } |
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2357 } |
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2358 else |
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 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
|
2361 spriv->vframes += nf; |
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2362 if(! spriv->vframes) |
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2363 mp_msg(MSGT_MUXER, MSGL_INFO, "AINIT: %.3lf\r\n", (double) spriv->last_pts/27000000.0f); |
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2364 } |
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
|
2365 } |
8585 | 2366 |
24902
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2367 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
|
2368 } |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
2369 |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
2370 |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
2371 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
|
2372 { |
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
|
2373 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
|
2374 double fake_timer; |
14753
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
2375 muxer_priv_t *priv = (muxer_priv_t *) muxer->priv; |
15947
e3d7f52776ff
added support for vbr audio (frames are parsed individually); fixed small bugs in the management of pes_extension
nicodvb
parents:
15278
diff
changeset
|
2376 |
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
|
2377 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
|
2378 |
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
|
2379 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
|
2380 { |
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 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
|
2382 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
|
2383 } |
14753
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
2384 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
|
2385 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
|
2386 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
|
2387 { |
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
|
2388 priv->scr = 0; |
21660
ca9da45d13e9
muxers now write to output muxer->stream rather than to muxer->file
nicodvb
parents:
21544
diff
changeset
|
2389 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
|
2390 } |
14753
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
2391 |
16750
0a31740dd5e6
Use PRI?64 defines as format strings for 64 bit variables.
reimar
parents:
16192
diff
changeset
|
2392 mp_msg(MSGT_MUXER, MSGL_INFO, "\nOverhead: %.3lf%% (%"PRIu64" / %"PRIu64")\n", 100.0 * (double)priv->headers_size / (double)priv->data_size, priv->headers_size, priv->data_size); |
14753
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
2393 } |
70c446099f40
new mpeg 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 |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
2395 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
|
2396 { |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
2397 muxer_priv_t *priv = (muxer_priv_t*) muxer->priv; |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
2398 |
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
|
2399 mp_msg(MSGT_MUXER, MSGL_INFO, MSGTR_WritingHeader); |
cf6bfdf41143
Clean up some muxer messages, patch by Corey Hickey bugfood-ml AT -fatooh/org- , small fixes by me
reynaldo
parents:
17023
diff
changeset
|
2400 |
14753
70c446099f40
new mpeg 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 priv->headers_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
|
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 //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
|
2404 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
|
2405 { |
21660
ca9da45d13e9
muxers now write to output muxer->stream rather than to muxer->file
nicodvb
parents:
21544
diff
changeset
|
2406 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
|
2407 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
|
2408 } |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
2409 |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
2410 return; |
8585 | 2411 } |
2412 | |
14753
70c446099f40
new mpeg 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 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
|
2414 { |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
2415 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
|
2416 { |
21413
06d63614eeaa
permit to specify the sizes of the decoders' buffers
nicodvb
parents:
21372
diff
changeset
|
2417 int v = (conf_vbuf_size ? conf_vbuf_size : 232); |
06d63614eeaa
permit to specify the sizes of the decoders' buffers
nicodvb
parents:
21372
diff
changeset
|
2418 int a1 = (conf_abuf_size ? conf_abuf_size : 4); |
06d63614eeaa
permit to specify the sizes of the decoders' buffers
nicodvb
parents:
21372
diff
changeset
|
2419 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
|
2420 |
14753
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
2421 priv->sys_info.cnt = 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
|
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 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
|
2424 priv->sys_info.streams[0].type = 1; |
21413
06d63614eeaa
permit to specify the sizes of the decoders' buffers
nicodvb
parents:
21372
diff
changeset
|
2425 priv->sys_info.streams[0].bufsize = v*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
|
2426 |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
2427 priv->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
|
2428 priv->sys_info.streams[1].type = 0; |
21413
06d63614eeaa
permit to specify the sizes of the decoders' buffers
nicodvb
parents:
21372
diff
changeset
|
2429 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
|
2430 |
70c446099f40
new mpeg 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[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
|
2432 priv->sys_info.streams[2].type = 1; |
21413
06d63614eeaa
permit to specify the sizes of the decoders' buffers
nicodvb
parents:
21372
diff
changeset
|
2433 priv->sys_info.streams[2].bufsize = a2*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
|
2434 |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
2435 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
|
2436 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
|
2437 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
|
2438 } |
70c446099f40
new mpeg 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 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
|
2440 { |
21413
06d63614eeaa
permit to specify the sizes of the decoders' buffers
nicodvb
parents:
21372
diff
changeset
|
2441 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
|
2442 int a1 = (conf_abuf_size ? conf_abuf_size : 4); |
06d63614eeaa
permit to specify the sizes of the decoders' buffers
nicodvb
parents:
21372
diff
changeset
|
2443 |
14753
70c446099f40
new mpeg 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.cnt = 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
|
2445 |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
2446 priv->sys_info.streams[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
|
2447 priv->sys_info.streams[0].type = 1; |
21413
06d63614eeaa
permit to specify the sizes of the decoders' buffers
nicodvb
parents:
21372
diff
changeset
|
2448 priv->sys_info.streams[0].bufsize = v*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
|
2449 |
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
2450 priv->sys_info.streams[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
|
2451 priv->sys_info.streams[1].type = 0; |
21413
06d63614eeaa
permit to specify the sizes of the decoders' buffers
nicodvb
parents:
21372
diff
changeset
|
2452 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
|
2453 } |
70c446099f40
new mpeg 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 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
|
2455 priv->sys_info.cnt = 0; |
8585 | 2456 } |
2457 | |
21467 | 2458 /* 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
|
2459 static void generate_flags(uint8_t *bff_mask, int source, int target) |
21467 | 2460 { |
2461 unsigned int i, trfp; | |
2462 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
|
2463 unsigned char ormask[4] = {0x0, 0x2, 0x80, 0x82}; |
21467 | 2464 |
2465 dfl = (target - source) << 1; | |
2466 tfl = source >> 1; | |
2467 | |
2468 trfp = 0; | |
2469 for(i = 0; i < MAX_PATTERN_LENGTH; i++) | |
2470 { | |
2471 tfl += dfl; | |
2472 if(tfl >= source) | |
2473 { | |
2474 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
|
2475 bff_mask[i] = ormask[trfp + 1]; |
21467 | 2476 trfp ^= 2; |
2477 } | |
2478 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
|
2479 bff_mask[i] = ormask[trfp]; |
21467 | 2480 } |
2481 } | |
14753
70c446099f40
new mpeg muxer compatible with dvd/[s]vcd; small changes in the muxer layer (sanity checks in the muxer_init functions)
nicodvb
parents:
12341
diff
changeset
|
2482 |
24902
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2483 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
|
2484 { |
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2485 muxer_priv_t *priv; |
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2486 priv = (muxer_priv_t *) calloc(1, sizeof(muxer_priv_t)); |
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2487 if(priv == NULL) |
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2488 return 0; |
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2489 priv->update_system_header = 1; |
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2490 |
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2491 //calloc() already zero-ed all flags, so we assign only the ones we need |
21467 | 2492 |
24902
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2493 if(conf_mux != NULL) |
21467 | 2494 { |
24902
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2495 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
|
2496 { |
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2497 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
|
2498 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
|
2499 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
|
2500 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
|
2501 } |
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2502 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
|
2503 { |
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2504 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
|
2505 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
|
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->muxrate = 10080 * 125; |
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2508 } |
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2509 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
|
2510 { |
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2511 priv->mux = MUX_MPEG2; |
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2512 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
|
2513 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
|
2514 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
|
2515 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
|
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, "xvcd")) |
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_MPEG1; |
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2520 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
|
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 = 75*2352; |
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, "pes1")) |
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->rawpes = 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 = 2048; |
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2530 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
|
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, "pes2")) |
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_MPEG2; |
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 |
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 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
|
2544 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
|
2545 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
|
2546 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
|
2547 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
|
2548 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
|
2549 } |
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 |
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2552 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
|
2553 priv->ts_allframes = 1; |
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2554 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
|
2555 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
|
2556 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
|
2557 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
|
2558 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
|
2559 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
|
2560 setup_sys_params(priv); |
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2561 |
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2562 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
|
2563 { |
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2564 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
|
2565 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
|
2566 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
|
2567 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
|
2568 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
|
2569 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
|
2570 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
|
2571 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
|
2572 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
|
2573 else |
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2574 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
|
2575 } |
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2576 |
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2577 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
|
2578 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
|
2579 { |
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2580 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
|
2581 conf_vframerate = 0; |
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2582 } |
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2583 |
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2584 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
|
2585 { |
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_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
|
2587 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
|
2588 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
|
2589 } |
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2590 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
|
2591 { |
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_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
|
2593 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
|
2594 conf_telecine = TELECINE_DGPULLDOWN; |
21467 | 2595 } |
2596 | |
24902
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2597 if(conf_telecine_src>0 && conf_telecine_dest>0 && conf_telecine_src < conf_telecine_dest) |
14914 | 2598 { |
24902
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2599 int sfps, tfps; |
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2600 |
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2601 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
|
2602 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
|
2603 if(sfps % 2 || tfps % 2) |
21486 | 2604 { |
24902
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2605 sfps *= 2; |
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2606 tfps *= 2; |
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2607 } |
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2608 |
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2609 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
|
2610 { |
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2611 mp_msg(MSGT_MUXER, MSGL_ERR, "ERROR! Framerate increment must be <= 1.5, telecining disabled\n"); |
21486 | 2612 conf_telecine = 0; |
2613 } | |
24902
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2614 else |
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2615 { |
25720
333540254bb4
Put bff_mask into muxer context instead of a global variable.
reimar
parents:
25098
diff
changeset
|
2616 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
|
2617 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
|
2618 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
|
2619 } |
14914 | 2620 } |
24902
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2621 |
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2622 if(conf_vframerate) |
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2623 { |
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2624 int fps; |
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2625 |
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2626 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
|
2627 switch(fps) |
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2628 { |
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2629 case 24000: |
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2630 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
|
2631 break; |
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2632 case 24024: |
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2633 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
|
2634 break; |
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2635 case 25025: |
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2636 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
|
2637 break; |
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2638 case 30000: |
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2639 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
|
2640 break; |
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2641 case 30030: |
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2642 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
|
2643 break; |
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2644 case 50050: |
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2645 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
|
2646 break; |
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2647 case 60000: |
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2648 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
|
2649 break; |
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2650 case 60060: |
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2651 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
|
2652 break; |
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2653 default: |
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2654 { |
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2655 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
|
2656 if(conf_telecine) |
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2657 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
|
2658 conf_telecine = 0; |
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2659 } |
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2660 } |
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2661 } |
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 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
|
2664 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
|
2665 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
|
2666 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
|
2667 priv->vbitrate = ((conf_vbitrate) * 10) >> 2; //*1000 / 400 |
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 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
|
2670 { |
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2671 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
|
2672 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
|
2673 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
|
2674 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
|
2675 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
|
2676 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
|
2677 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
|
2678 if(priv->vframerate) |
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2679 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
|
2680 if(priv->vaspect) |
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, " 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
|
2682 if(priv->vbitrate) |
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, " 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
|
2684 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
|
2685 } |
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2686 |
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2687 priv->has_video = priv->has_audio = 0; |
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2688 |
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2689 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
|
2690 priv->scr = muxer->file_end = 0; |
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2691 |
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2692 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
|
2693 { |
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2694 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
|
2695 return 0; |
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2696 } |
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2697 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
|
2698 priv->init_adelay = - (double) conf_init_adelay / (double) 1000.0; |
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2699 |
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2700 priv->drop = 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 priv->buff = (uint8_t *) malloc(priv->packet_size); |
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2703 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
|
2704 { |
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2705 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
|
2706 return 0; |
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2707 } |
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2708 |
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2709 muxer->priv = (void *) priv; |
c1660ecae8c4
100% cosmetics: reformatted with tabs and symmetric braces and removed useless braces and trailing tabs
nicodvb
parents:
24631
diff
changeset
|
2710 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
|
2711 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
|
2712 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
|
2713 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
|
2714 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
|
2715 return 1; |
8585 | 2716 } |
2717 |