11#include "mp4.h"
22
33uint32_t default_sample_size = 40000 ;
4+ uint32_t last_fragment_duration , timescale ;
45
5- unsigned int aud_samplerate = 0 , aud_framesize = 0 ;
6+ unsigned int aud_samplerate = 0 ;
67unsigned short aud_bitrate = 0 ;
78char aud_channels = 0 , aud_codec = 0 , vid_framerate = 30 ;
89short vid_width = 1920 , vid_height = 1080 ;
@@ -42,8 +43,8 @@ enum BufError create_header(char is_h265) {
4243 moov_info .horizontal_resolution = 0x00480000 ; // 72 dpi
4344 moov_info .vertical_resolution = 0x00480000 ; // 72 dpi
4445 moov_info .creation_time = 0 ;
45- moov_info . timescale =
46- default_sample_size * vid_framerate ;
46+ timescale = default_sample_size * vid_framerate ;
47+ moov_info . timescale = timescale ;
4748 moov_info .sps = buf_sps ;
4849 moov_info .sps_length = buf_sps_len ;
4950 moov_info .pps = buf_pps ;
@@ -66,13 +67,6 @@ void mp4_set_config(short width, short height, char framerate, char acodec,
6667 aud_bitrate = bitrate ;
6768 aud_channels = channels ;
6869 aud_samplerate = srate ;
69- if (aud_samplerate > 0 ) {
70- aud_framesize =
71- (aud_samplerate >= 32000 ? 144 : 72 ) *
72- (aud_bitrate * 1000 ) /
73- aud_samplerate ;
74- } else aud_framesize = 384 ;
75-
7670}
7771
7872void mp4_set_sps (const char * nal_data , const uint32_t nal_len , char is_h265 ) {
@@ -95,6 +89,7 @@ void mp4_set_vps(const char *nal_data, const uint32_t nal_len) {
9589
9690enum BufError mp4_set_slice (const char * nal_data , const uint32_t nal_len ,
9791 char is_iframe ) {
92+ uint64_t aud_ticks ;
9893 enum BufError err ;
9994
10095 struct SampleInfo samples_info [2 ];
@@ -103,8 +98,12 @@ enum BufError mp4_set_slice(const char *nal_data, const uint32_t nal_len,
10398 samples_info [0 ].duration = default_sample_size ;
10499 samples_info [0 ].flags = is_iframe ? 0 : 65536 ;
105100 samples_info [1 ].size = buf_aud .offset ;
106- samples_info [1 ].duration = default_sample_size *
107- buf_aud .offset / (aud_bitrate * 25 / 6 );
101+ if (aud_bitrate > 0 )
102+ aud_ticks = ((uint64_t )(buf_aud .offset << 3 ) * timescale ) /
103+ (aud_bitrate * 1000 );
104+ samples_info [1 ].duration = (uint32_t )aud_ticks ;
105+ last_fragment_duration =
106+ MAX (samples_info [1 ].duration , samples_info [0 ].duration );
108107
109108 buf_moof .offset = 0 ;
110109 err = write_moof (
@@ -113,7 +112,7 @@ enum BufError mp4_set_slice(const char *nal_data, const uint32_t nal_len,
113112 chk_err ;
114113
115114 buf_mdat .offset = 0 ;
116- err = write_mdat (& buf_mdat , nal_data , nal_len ,
115+ err = write_mdat (& buf_mdat , nal_data , nal_len ,
117116 buf_aud .buf , buf_aud .offset );
118117 chk_err ;
119118
@@ -145,7 +144,7 @@ enum BufError mp4_set_state(struct Mp4State *state) {
145144 state -> base_media_decode_time );
146145 chk_err state -> sequence_number ++ ;
147146 state -> base_data_offset += buf_moof .offset + buf_mdat .offset ;
148- state -> base_media_decode_time += state -> default_sample_duration ;
147+ state -> base_media_decode_time += last_fragment_duration ;
149148 return BUF_OK ;
150149}
151150
@@ -168,4 +167,4 @@ enum BufError mp4_get_moof(struct BitBuf *ptr) {
168167 ptr -> size = buf_moof .size ;
169168 ptr -> offset = buf_moof .offset ;
170169 return BUF_OK ;
171- }
170+ }
0 commit comments