Skip to content

Commit 5caafad

Browse files
committed
fix #409: support pure video hls. 2.0.172.
1 parent 3ad030f commit 5caafad

File tree

7 files changed

+35
-9
lines changed

7 files changed

+35
-9
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -342,6 +342,7 @@ Remark:
342342
## History
343343

344344
### SRS 2.0 history
345+
* v2.0, 2015-05-29, fix [#409](https://github.com/simple-rtmp-server/srs/issues/409) support pure video hls. 2.0.172.
345346
* v2.0, 2015-05-28, support [srs-dolphin][srs-dolphin], the multiple-process SRS.
346347
* v2.0, 2015-05-24, fix [#404](https://github.com/simple-rtmp-server/srs/issues/404) register handler then start http thread. 2.0.167.
347348
* v2.0, 2015-05-23, refine the thread, protocol, kbps code. 2.0.166

trunk/conf/full.conf

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -608,7 +608,7 @@ vhost with-hls.srs.com {
608608
# when codec changed, write the PAT/PMT table, but maybe ok util next ts.
609609
# so user can set the default codec for mp3.
610610
# the available audio codec:
611-
# aac, mp3
611+
# aac, mp3, an
612612
# default: aac
613613
hls_acodec aac;
614614
# the default video codec of hls.

trunk/src/app/srs_app_hls.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -420,6 +420,9 @@ int SrsHlsMuxer::segment_open(int64_t segment_start_dts)
420420
} else if (default_acodec_str == "aac") {
421421
default_acodec = SrsCodecAudioAAC;
422422
srs_info("hls: use default aac acodec");
423+
} else if (default_acodec_str == "an") {
424+
default_acodec = SrsCodecAudioDisabled;
425+
srs_info("hls: use default an acodec for pure video");
423426
} else {
424427
srs_warn("hls: use aac for other codec=%s", default_acodec_str.c_str());
425428
}

trunk/src/core/srs_core.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
3131
// current release version
3232
#define VERSION_MAJOR 2
3333
#define VERSION_MINOR 0
34-
#define VERSION_REVISION 171
34+
#define VERSION_REVISION 172
3535

3636
// server info.
3737
#define RTMP_SIG_SRS_KEY "SRS"

trunk/src/kernel/srs_kernel_codec.hpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,9 @@ enum SrsCodecAudio
136136
// set to the max value to reserved, for array map.
137137
SrsCodecAudioReserved1 = 16,
138138

139+
// for user to disable audio, for example, use pure video hls.
140+
SrsCodecAudioDisabled = 17,
141+
139142
SrsCodecAudioLinearPCMPlatformEndian = 0,
140143
SrsCodecAudioADPCM = 1,
141144
SrsCodecAudioMP3 = 2,

trunk/src/kernel/srs_kernel_error.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -215,13 +215,13 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
215215
#define ERROR_HTTP_DVR_CREATE_REQUEST 3053
216216
#define ERROR_HTTP_DVR_NO_TAEGET 3054
217217
#define ERROR_ADTS_ID_NOT_AAC 3055
218-
// HDS error code
219218
#define ERROR_HDS_OPEN_F4M_FAILED 3056
220219
#define ERROR_HDS_WRITE_F4M_FAILED 3057
221220
#define ERROR_HDS_OPEN_BOOTSTRAP_FAILED 3058
222221
#define ERROR_HDS_WRITE_BOOTSTRAP_FAILED 3059
223222
#define ERROR_HDS_OPEN_FRAGMENT_FAILED 3060
224223
#define ERROR_HDS_WRITE_FRAGMENT_FAILED 3061
224+
#define ERROR_HLS_NO_STREAM 3062
225225

226226
///////////////////////////////////////////////////////
227227
// HTTP/StreamCaster protocol error.

trunk/src/kernel/srs_kernel_ts.cpp

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -302,10 +302,12 @@ int SrsTsContext::encode(SrsFileWriter* writer, SrsTsMessage* msg, SrsCodecVideo
302302
vs = SrsTsStreamVideoH264;
303303
video_pid = TS_VIDEO_AVC_PID;
304304
break;
305+
case SrsCodecVideoDisabled:
306+
vs = SrsTsStreamReserved;
307+
break;
305308
case SrsCodecVideoReserved:
306309
case SrsCodecVideoReserved1:
307310
case SrsCodecVideoReserved2:
308-
case SrsCodecVideoDisabled:
309311
case SrsCodecVideoSorensonH263:
310312
case SrsCodecVideoScreenVideo:
311313
case SrsCodecVideoOn2VP6:
@@ -323,6 +325,9 @@ int SrsTsContext::encode(SrsFileWriter* writer, SrsTsMessage* msg, SrsCodecVideo
323325
as = SrsTsStreamAudioMp3;
324326
audio_pid = TS_AUDIO_MP3_PID;
325327
break;
328+
case SrsCodecAudioDisabled:
329+
as = SrsTsStreamReserved;
330+
break;
326331
case SrsCodecAudioReserved1:
327332
case SrsCodecAudioLinearPCMPlatformEndian:
328333
case SrsCodecAudioADPCM:
@@ -340,6 +345,12 @@ int SrsTsContext::encode(SrsFileWriter* writer, SrsTsMessage* msg, SrsCodecVideo
340345
break;
341346
}
342347

348+
if (as == SrsTsStreamReserved && vs == SrsTsStreamReserved) {
349+
ret = ERROR_HLS_NO_STREAM;
350+
srs_error("hls: no video or audio stream, vcodec=%d, acodec=%d. ret=%d", vc, ac, ret);
351+
return ret;
352+
}
353+
343354
// when any codec changed, write PAT/PMT table.
344355
if (vcodec != vc || acodec != ac) {
345356
vcodec = vc;
@@ -360,6 +371,12 @@ int SrsTsContext::encode(SrsFileWriter* writer, SrsTsMessage* msg, SrsCodecVideo
360371
int SrsTsContext::encode_pat_pmt(SrsFileWriter* writer, int16_t vpid, SrsTsStream vs, int16_t apid, SrsTsStream as)
361372
{
362373
int ret = ERROR_SUCCESS;
374+
375+
if (vs != SrsTsStreamVideoH264 && as != SrsTsStreamAudioAAC && as != SrsTsStreamAudioMp3) {
376+
ret = ERROR_HLS_NO_STREAM;
377+
srs_error("hls: no pmt pcr pid, vs=%d, as=%d. ret=%d", vs, as, ret);
378+
return ret;
379+
}
363380

364381
int16_t pmt_number = TS_PMT_NUMBER;
365382
int16_t pmt_pid = TS_PMT_PID;
@@ -754,15 +771,17 @@ SrsTsPacket* SrsTsPacket::create_pmt(SrsTsContext* context, int16_t pmt_number,
754771
pmt->last_section_number = 0;
755772
pmt->program_info_length = 0;
756773

757-
// use audio to carray pcr by default.
758-
// for hls, there must be atleast one audio channel.
759-
pmt->PCR_PID = apid;
760-
pmt->infos.push_back(new SrsTsPayloadPMTESInfo(as, apid));
761-
762774
// if h.264 specified, use video to carry pcr.
763775
if (vs == SrsTsStreamVideoH264) {
764776
pmt->PCR_PID = vpid;
765777
pmt->infos.push_back(new SrsTsPayloadPMTESInfo(vs, vpid));
778+
} else if (as == SrsTsStreamAudioAAC || as == SrsTsStreamAudioMp3) {
779+
// use audio to carray pcr by default.
780+
// for hls, there must be atleast one audio channel.
781+
pmt->PCR_PID = apid;
782+
pmt->infos.push_back(new SrsTsPayloadPMTESInfo(as, apid));
783+
} else {
784+
srs_assert(false);
766785
}
767786

768787
pmt->CRC_32 = 0; // calc in encode.

0 commit comments

Comments
 (0)