Skip to content

Commit

Permalink
Merge branch v5.0.116 into develop
Browse files Browse the repository at this point in the history
1. MP3: Fix bug for TS or HLS with mp3 codec. v4.0.269 (#296) (#3333)
2. MP3: Add config examples for MP3. #296
3. Script: Refine GitHub actions.
  • Loading branch information
winlinvip committed Dec 25, 2022
2 parents 9c06608 + f6e0b1c commit dc07958
Show file tree
Hide file tree
Showing 16 changed files with 229 additions and 179 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/codeql-analysis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ on: [push, pull_request]
jobs:
analyze:
name: actions-codeql-analyze
runs-on: ubuntu-latest
runs-on: ubuntu-20.04

strategy:
fail-fast: false
Expand Down
80 changes: 50 additions & 30 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,22 @@ name: "Test"
# @see https://docs.github.com/en/actions/reference/workflow-syntax-for-github-actions#onpushpull_requestbranchestags
on: [push, pull_request]

# The dependency graph:
# multiple-arch-armv7(13m)
# multiple-arch-aarch64(7m)
# cygwin64-cache(1m)
# cygwin64(6m) - Must depends on cygwin64-cache.
# fast(0s) - To limit all fastly run jobs after slow jobs.
# build-centos7(3m)
# build-ubuntu16(3m)
# build-ubuntu18(2m)
# build-ubuntu20(2m)
# build-cross-arm(3m)
# build-cross-aarch64(3m)
# multiple-arch-amd64(2m)
# utest(3m)
# coverage(3m) - Must depends on utest.

jobs:
cygwin64-cache:
name: cygwin64-cache
Expand Down Expand Up @@ -66,7 +82,7 @@ jobs:
name: build-centos7
runs-on: ubuntu-20.04
needs:
- utest
- fast
steps:
- name: Checkout repository
uses: actions/checkout@v2
Expand All @@ -88,7 +104,7 @@ jobs:
name: build-ubuntu16
runs-on: ubuntu-20.04
needs:
- utest
- fast
steps:
- name: Checkout repository
uses: actions/checkout@v2
Expand All @@ -104,7 +120,7 @@ jobs:
name: build-ubuntu18
runs-on: ubuntu-20.04
needs:
- utest
- fast
steps:
- name: Checkout repository
uses: actions/checkout@v2
Expand All @@ -120,7 +136,7 @@ jobs:
name: build-ubuntu20
runs-on: ubuntu-20.04
needs:
- utest
- fast
steps:
- name: Checkout repository
uses: actions/checkout@v2
Expand All @@ -135,6 +151,8 @@ jobs:
build-cross-arm:
name: build-cross-arm
runs-on: ubuntu-20.04
needs:
- fast
steps:
- name: Checkout repository
uses: actions/checkout@v2
Expand All @@ -148,6 +166,8 @@ jobs:
build-cross-aarch64:
name: build-cross-aarch64
runs-on: ubuntu-20.04
needs:
- fast
steps:
- name: Checkout repository
uses: actions/checkout@v2
Expand All @@ -158,21 +178,6 @@ jobs:
outputs:
SRS_BUILD_CROSS_AARCH64_DONE: ok

build:
name: build
needs:
- build-centos7
- build-ubuntu16
- build-ubuntu18
- build-ubuntu20
- build-cross-arm
- build-cross-aarch64
runs-on: ubuntu-20.04
steps:
- run: echo 'Build done'
outputs:
SRS_BUILD_DONE: ok

utest:
name: utest
runs-on: ubuntu-20.04
Expand Down Expand Up @@ -229,8 +234,8 @@ jobs:
outputs:
SRS_COVERAGE_DONE: ok

multile-arch-armv7:
name: multile-arch-armv7
multiple-arch-armv7:
name: multiple-arch-armv7
runs-on: ubuntu-20.04
steps:
- name: Checkout repository
Expand All @@ -251,8 +256,8 @@ jobs:
outputs:
SRS_MULTIPLE_ARCH_ARMV7_DONE: ok

multile-arch-aarch64:
name: multile-arch-aarch64
multiple-arch-aarch64:
name: multiple-arch-aarch64
runs-on: ubuntu-20.04
steps:
- name: Checkout repository
Expand All @@ -273,11 +278,11 @@ jobs:
outputs:
SRS_MULTIPLE_ARCH_AARCH64_DONE: ok

multile-arch-amd64:
name: multile-arch-amd64
multiple-arch-amd64:
name: multiple-arch-amd64
runs-on: ubuntu-20.04
needs:
- utest
- fast
steps:
- name: Checkout repository
uses: actions/checkout@v2
Expand All @@ -297,15 +302,30 @@ jobs:
outputs:
SRS_MULTIPLE_ARCH_AMD64_DONE: ok

fast:
name: fast
needs:
- cygwin64-cache
runs-on: ubuntu-20.04
steps:
- run: echo 'Start fast jobs'
outputs:
SRS_FAST_DONE: ok

done:
name: done
needs:
- cygwin64
- build
- coverage
- multile-arch-armv7
- multile-arch-aarch64
- multile-arch-amd64
- build-centos7
- build-ubuntu16
- build-ubuntu18
- build-ubuntu20
- build-cross-arm
- build-cross-aarch64
- multiple-arch-armv7
- multiple-arch-aarch64
- multiple-arch-amd64
runs-on: ubuntu-20.04
steps:
- run: echo 'All done'
Expand Down
19 changes: 19 additions & 0 deletions trunk/conf/mp3.conf
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
listen 1935;
max_connections 1000;
daemon off;
srs_log_tank console;
http_server {
enabled on;
listen 8080;
dir ./objs/nginx/html;
}
vhost __defaultVhost__ {
http_remux {
enabled on;
mount [vhost]/[app]/[stream].flv;
}
hls {
enabled on;
hls_acodec mp3;
}
}
15 changes: 15 additions & 0 deletions trunk/conf/mp3.http.conf
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
listen 1935;
max_connections 1000;
daemon off;
srs_log_tank console;
http_server {
enabled on;
listen 8080;
dir ./objs/nginx/html;
}
vhost __defaultVhost__ {
http_remux {
enabled on;
mount [vhost]/[app]/[stream].mp3;
}
}
15 changes: 15 additions & 0 deletions trunk/conf/mp3.ts.conf
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
listen 1935;
max_connections 1000;
daemon off;
srs_log_tank console;
http_server {
enabled on;
listen 8080;
dir ./objs/nginx/html;
}
vhost __defaultVhost__ {
http_remux {
enabled on;
mount [vhost]/[app]/[stream].ts;
}
}
2 changes: 2 additions & 0 deletions trunk/doc/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ The changelog for SRS.

## SRS 5.0 Changelog

* v5.0, 2022-12-25, For [#296](https://github.com/ossrs/srs/issues/296): MP3: Support mp3 for RTMP/HLS/HTTP-FLV/HTTP-TS/HLS etc. v5.0.116
* v5.0, 2022-12-24, Fix [#3328](https://github.com/ossrs/srs/issues/3328): Docker: Avoiding duplicated copy files. v5.0.115
* v5.0, 2022-12-20, Merge [#3321](https://github.com/ossrs/srs/pull/3321): GB: Refine lazy object GC. v5.0.114
* v5.0, 2022-12-18, Merge [#3324](https://github.com/ossrs/srs/pull/3324): Asan: Support parse asan symbol backtrace log. v5.0.113
Expand Down Expand Up @@ -130,6 +131,7 @@ The changelog for SRS.

## SRS 4.0 Changelog

* v4.0, 2022-12-24, For [#296](https://github.com/ossrs/srs/issues/296): MP3: Fix bug for TS or HLS with mp3 codec. v4.0.269
* v4.0, 2022-11-22, Pick [#3079](https://github.com/ossrs/srs/issues/3079): WebRTC: Fix no audio and video issue for Firefox. v4.0.268
* v4.0, 2022-10-10, For [#2901](https://github.com/ossrs/srs/issues/2901): Edge: Fast disconnect and reconnect. v4.0.267
* v4.0, 2022-09-27, For [#3167](https://github.com/ossrs/srs/issues/3167): WebRTC: Refine sequence jitter algorithm. v4.0.266
Expand Down
4 changes: 2 additions & 2 deletions trunk/src/app/srs_app_config.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1851,11 +1851,11 @@ srs_error_t SrsConfig::parse_options(int argc, char** argv)
}

if (show_version) {
fprintf(stderr, "%s\n", RTMP_SIG_SRS_VERSION);
fprintf(stdout, "%s\n", RTMP_SIG_SRS_VERSION);
exit(0);
}
if (show_signature) {
fprintf(stderr, "%s\n", RTMP_SIG_SRS_SERVER);
fprintf(stdout, "%s\n", RTMP_SIG_SRS_SERVER);
exit(0);
}

Expand Down
28 changes: 28 additions & 0 deletions trunk/src/app/srs_app_hls.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -202,6 +202,7 @@ SrsHlsMuxer::SrsHlsMuxer()
async = new SrsAsyncCallWorker();
context = new SrsTsContext();
segments = new SrsFragmentWindow();
latest_acodec_ = SrsAudioCodecIdForbidden;

memset(key, 0, 16);
memset(iv, 0, 16);
Expand Down Expand Up @@ -263,6 +264,24 @@ int SrsHlsMuxer::deviation()
return deviation_ts;
}

SrsAudioCodecId SrsHlsMuxer::latest_acodec()
{
// If current context writer exists, we query from it.
if (current && current->tscw) return current->tscw->acodec();

// Get the configured or updated config.
return latest_acodec_;
}

void SrsHlsMuxer::set_latest_acodec(SrsAudioCodecId v)
{
// Refresh the codec in context writer for current segment.
if (current && current->tscw) current->tscw->set_acodec(v);

// Refresh the codec for future segments.
latest_acodec_ = v;
}

srs_error_t SrsHlsMuxer::initialize()
{
return srs_success;
Expand Down Expand Up @@ -371,6 +390,8 @@ srs_error_t SrsHlsMuxer::segment_open()
srs_warn("hls: use aac for other codec=%s", default_acodec_str.c_str());
}
}
// Now that we know the latest audio codec in stream, use it.
if (latest_acodec_ != SrsAudioCodecIdForbidden) default_acodec = latest_acodec_;

// load the default vcodec from config.
SrsVideoCodecId default_vcodec = SrsVideoCodecIdAVC;
Expand Down Expand Up @@ -969,6 +990,13 @@ srs_error_t SrsHlsController::on_sequence_header()
srs_error_t SrsHlsController::write_audio(SrsAudioFrame* frame, int64_t pts)
{
srs_error_t err = srs_success;

// Refresh the codec ASAP.
if (muxer->latest_acodec() != frame->acodec()->id) {
srs_trace("HLS: Switch audio codec %d(%s) to %d(%s)", muxer->latest_acodec(), srs_audio_codec_id2str(muxer->latest_acodec()).c_str(),
frame->acodec()->id, srs_audio_codec_id2str(frame->acodec()->id).c_str());
muxer->set_latest_acodec(frame->acodec()->id);
}

// write audio to cache.
if ((err = tsmc->cache_audio(frame, pts)) != srs_success) {
Expand Down
6 changes: 6 additions & 0 deletions trunk/src/app/srs_app_hls.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -156,6 +156,9 @@ class SrsHlsMuxer
SrsHlsSegment* current;
// The ts context, to keep cc continous between ts.
SrsTsContext* context;
private:
// Latest audio codec, parsed from stream.
SrsAudioCodecId latest_acodec_;
public:
SrsHlsMuxer();
virtual ~SrsHlsMuxer();
Expand All @@ -166,6 +169,9 @@ class SrsHlsMuxer
virtual std::string ts_url();
virtual srs_utime_t duration();
virtual int deviation();
public:
SrsAudioCodecId latest_acodec();
void set_latest_acodec(SrsAudioCodecId v);
public:
// Initialize the hls muxer.
virtual srs_error_t initialize();
Expand Down
4 changes: 3 additions & 1 deletion trunk/src/app/srs_app_http_stream.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -829,7 +829,9 @@ void SrsLiveStream::http_hooks_on_stop(ISrsHttpMessage* r)
srs_error_t SrsLiveStream::streaming_send_messages(ISrsBufferEncoder* enc, SrsSharedPtrMessage** msgs, int nb_msgs)
{
srs_error_t err = srs_success;


// TODO: In gop cache, we know both the audio and video codec, so we should notice the encoder, which might depends
// on setting the correct codec information, for example, HTTP-TS or HLS will write PMT.
for (int i = 0; i < nb_msgs; i++) {
SrsSharedPtrMessage* msg = msgs[i];

Expand Down
2 changes: 1 addition & 1 deletion trunk/src/core/srs_core_version4.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,6 @@

#define VERSION_MAJOR 4
#define VERSION_MINOR 0
#define VERSION_REVISION 268
#define VERSION_REVISION 269

#endif
2 changes: 1 addition & 1 deletion trunk/src/core/srs_core_version5.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,6 @@

#define VERSION_MAJOR 5
#define VERSION_MINOR 0
#define VERSION_REVISION 115
#define VERSION_REVISION 116

#endif
16 changes: 6 additions & 10 deletions trunk/src/kernel/srs_kernel_codec.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -595,6 +595,9 @@ srs_error_t SrsFrame::initialize(SrsCodecConfig* c)
srs_error_t SrsFrame::add_sample(char* bytes, int size)
{
srs_error_t err = srs_success;

// Ignore empty sample.
if (!bytes || size <= 0) return err;

if (nb_samples >= SrsMaxNbSamples) {
return srs_error_new(ERROR_HLS_DECODE_ERROR, "Frame samples overflow");
Expand Down Expand Up @@ -2063,20 +2066,13 @@ srs_error_t SrsFormat::audio_mp3_demux(SrsBuffer* stream, int64_t timestamp)
// we always decode aac then mp3.
srs_assert(acodec->id == SrsAudioCodecIdMP3);

// Update the RAW MP3 data.
// Update the RAW MP3 data. Note the start is 12 bits syncword 0xFFF, so we should not skip any bytes, for detail
// please see ISO_IEC_11172-3-MP3-1993.pdf page 20 and 26.
raw = stream->data() + stream->pos();
nb_raw = stream->size() - stream->pos();

stream->skip(1);
if (stream->empty()) {
return err;
}

char* data = stream->data() + stream->pos();
int size = stream->size() - stream->pos();

// mp3 payload.
if ((err = audio->add_sample(data, size)) != srs_success) {
if ((err = audio->add_sample(raw, nb_raw)) != srs_success) {
return srs_error_wrap(err, "add audio frame");
}

Expand Down
Loading

0 comments on commit dc07958

Please sign in to comment.