Skip to content

Commit 8e4d95f

Browse files
committed
Distinguishing sync/non-sync MP4 samples, handling disabled audio tracks
1 parent 584d32f commit 8e4d95f

3 files changed

Lines changed: 12 additions & 8 deletions

File tree

src/app_config.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -444,8 +444,8 @@ enum ConfigError parse_app_config(void) {
444444
parse_bool(&ini, "stream", "enable", &app_config.stream_enable);
445445
if (app_config.stream_enable) {
446446
int count, val;
447-
parse_int(&ini, "stream", "udp_srcport", 0, USHRT_MAX, &val);
448-
if (err != CONFIG_OK) app_config.stream_udp_srcport = (unsigned short)val;
447+
err = parse_int(&ini, "stream", "udp_srcport", 0, USHRT_MAX, &val);
448+
if (err == CONFIG_OK) app_config.stream_udp_srcport = (unsigned short)val;
449449
parse_list(&ini, "stream", "dest",
450450
sizeof(app_config.stream_dests) / sizeof(*app_config.stream_dests),
451451
&count, app_config.stream_dests);

src/fmt/moof.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -315,7 +315,8 @@ enum BufError write_trun(
315315
}
316316

317317
if (first_sample_flags_present) {
318-
err = put_u32_be(ptr, is_audio ? 0 : 33554432);
318+
err = put_u32_be(ptr, is_audio ? 0x02000000 :
319+
(samples_info[0].flags == 0 ? 0x02000000 : 0x01010000));
319320
chk_err; // 4 first_sample_flags
320321
}
321322
for (uint32_t i = 0; i < samples_info_count; ++i) {

src/fmt/mp4.c

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ void mp4_set_vps(const char *nal_data, const uint32_t nal_len) {
8989

9090
enum BufError mp4_set_slice(const char *nal_data, const uint32_t nal_len,
9191
char is_iframe) {
92-
uint64_t aud_ticks;
92+
uint64_t aud_ticks = 0;
9393
enum BufError err;
9494

9595
struct SampleInfo samples_info[2];
@@ -98,12 +98,15 @@ enum BufError mp4_set_slice(const char *nal_data, const uint32_t nal_len,
9898
samples_info[0].duration = default_sample_size;
9999
samples_info[0].flags = is_iframe ? 0 : 65536;
100100
samples_info[1].size = buf_aud.offset;
101-
if (aud_bitrate > 0)
101+
if (aud_bitrate > 0 && buf_aud.offset > 0) {
102102
aud_ticks = ((uint64_t)(buf_aud.offset << 3) * timescale) /
103103
(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);
104+
samples_info[1].duration = (uint32_t)aud_ticks;
105+
last_fragment_duration = MAX(samples_info[1].duration, samples_info[0].duration);
106+
} else {
107+
samples_info[1].duration = 0;
108+
last_fragment_duration = samples_info[0].duration;
109+
}
107110

108111
buf_moof.offset = 0;
109112
err = write_moof(

0 commit comments

Comments
 (0)