Skip to content

Commit 4246be9

Browse files
committed
for ossrs#250, merge avc to codec. use queue to dequeue.
1 parent 153a3a6 commit 4246be9

12 files changed

+959
-928
lines changed

trunk/configure

+1-1
Original file line numberDiff line numberDiff line change
@@ -366,7 +366,7 @@ ModuleLibIncs=(${SRS_OBJS_DIR})
366366
MODULE_FILES=("srs_kernel_error" "srs_kernel_log" "srs_kernel_stream"
367367
"srs_kernel_utility" "srs_kernel_flv" "srs_kernel_codec" "srs_kernel_file"
368368
"srs_kernel_consts" "srs_kernel_aac" "srs_kernel_mp3" "srs_kernel_ts"
369-
"srs_kernel_avc" "srs_kernel_buffer")
369+
"srs_kernel_buffer")
370370
KERNEL_INCS="src/kernel"; MODULE_DIR=${KERNEL_INCS} . auto/modules.sh
371371
KERNEL_OBJS="${MODULE_OBJS[@]}"
372372
#

trunk/ide/srs_upp/srs_upp.upp

-2
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,6 @@ file
2020
kernel readonly separator,
2121
../../src/kernel/srs_kernel_aac.hpp,
2222
../../src/kernel/srs_kernel_aac.cpp,
23-
../../src/kernel/srs_kernel_avc.hpp,
24-
../../src/kernel/srs_kernel_avc.cpp,
2523
../../src/kernel/srs_kernel_buffer.hpp,
2624
../../src/kernel/srs_kernel_buffer.cpp,
2725
../../src/kernel/srs_kernel_codec.hpp,

trunk/src/app/srs_app_hls.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ using namespace std;
4747
#include <srs_rtmp_sdk.hpp>
4848
#include <srs_app_pithy_print.hpp>
4949
#include <srs_kernel_utility.hpp>
50-
#include <srs_kernel_avc.hpp>
50+
#include <srs_kernel_codec.hpp>
5151
#include <srs_kernel_file.hpp>
5252
#include <srs_rtmp_buffer.hpp>
5353
#include <srs_kernel_ts.hpp>

trunk/src/app/srs_app_mpegts_udp.cpp

+85-5
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,68 @@ ISrsUdpHandler::~ISrsUdpHandler()
5757
{
5858
}
5959

60+
SrsMpegtsQueue::SrsMpegtsQueue()
61+
{
62+
nb_audios = nb_videos = 0;
63+
}
64+
65+
SrsMpegtsQueue::~SrsMpegtsQueue()
66+
{
67+
std::map<int64_t, SrsSharedPtrMessage*>::iterator it;
68+
for (it = msgs.begin(); it != msgs.end(); ++it) {
69+
SrsSharedPtrMessage* msg = it->second;
70+
srs_freep(msg);
71+
}
72+
msgs.clear();
73+
}
74+
75+
int SrsMpegtsQueue::push(SrsSharedPtrMessage* msg)
76+
{
77+
int ret = ERROR_SUCCESS;
78+
79+
if (msgs.find(msg->timestamp) != msgs.end()) {
80+
srs_warn("mpegts: free the msg for dts exists, dts=%"PRId64, msg->timestamp);
81+
srs_freep(msg);
82+
return ret;
83+
}
84+
85+
if (msg->is_audio()) {
86+
nb_audios++;
87+
}
88+
89+
if (msg->is_video()) {
90+
nb_videos++;
91+
}
92+
93+
msgs[msg->timestamp] = msg;
94+
95+
return ret;
96+
}
97+
98+
SrsSharedPtrMessage* SrsMpegtsQueue::dequeue()
99+
{
100+
// got 2+ videos and audios, ok to dequeue.
101+
bool av_ok = nb_videos >= 2 && nb_audios >= 2;
102+
// 100 videos about 30s, while 300 audios about 30s
103+
bool av_overflow = nb_videos > 100 || nb_audios > 300;
104+
105+
if (av_ok || av_overflow) {
106+
std::map<int64_t, SrsSharedPtrMessage*>::iterator it = msgs.begin();
107+
SrsSharedPtrMessage* msg = it->second;
108+
msgs.erase(it);
109+
110+
if (msg->is_audio()) {
111+
nb_audios--;
112+
}
113+
114+
if (msg->is_video()) {
115+
nb_videos--;
116+
}
117+
}
118+
119+
return NULL;
120+
}
121+
60122
SrsMpegtsOverUdp::SrsMpegtsOverUdp(SrsConfDirective* c)
61123
{
62124
stream = new SrsStream();
@@ -72,6 +134,7 @@ SrsMpegtsOverUdp::SrsMpegtsOverUdp(SrsConfDirective* c)
72134
h264_sps_changed = false;
73135
h264_pps_changed = false;
74136
h264_sps_pps_sent = false;
137+
queue = new SrsMpegtsQueue();
75138
}
76139

77140
SrsMpegtsOverUdp::~SrsMpegtsOverUdp()
@@ -82,6 +145,7 @@ SrsMpegtsOverUdp::~SrsMpegtsOverUdp()
82145
srs_freep(stream);
83146
srs_freep(context);
84147
srs_freep(avc);
148+
srs_freep(queue);
85149
}
86150

87151
int SrsMpegtsOverUdp::on_udp_packet(sockaddr_in* from, char* buf, int nb_buf)
@@ -280,11 +344,14 @@ int SrsMpegtsOverUdp::on_ts_video(SrsTsMessage* msg, SrsStream* avs)
280344

281345
// it may be return error, but we must process all packets.
282346
if ((ret = write_h264_raw_frame(frame, frame_size, dts, pts)) != ERROR_SUCCESS) {
283-
if (ret = ERROR_H264_DROP_BEFORE_SPS_PPS) {
347+
if (ret == ERROR_H264_DROP_BEFORE_SPS_PPS) {
284348
continue;
285349
}
286350
return ret;
287351
}
352+
353+
// for video, drop others with same pts/dts.
354+
break;
288355
}
289356

290357
return ret;
@@ -399,15 +466,28 @@ int SrsMpegtsOverUdp::rtmp_write_packet(char type, u_int32_t timestamp, char* da
399466
SrsSharedPtrMessage* msg = NULL;
400467

401468
if ((ret = srs_rtmp_create_msg(type, timestamp, data, size, stream_id, &msg)) != ERROR_SUCCESS) {
469+
srs_error("mpegts: create shared ptr msg failed. ret=%d", ret);
402470
return ret;
403471
}
404-
405472
srs_assert(msg);
406-
407-
// send out encoded msg.
408-
if ((ret = client->send_and_free_message(msg, stream_id)) != ERROR_SUCCESS) {
473+
474+
// push msg to queue.
475+
if ((ret = queue->push(msg)) != ERROR_SUCCESS) {
476+
srs_error("mpegts: push msg to queue failed. ret=%d", ret);
409477
return ret;
410478
}
479+
480+
// for all ready msg, dequeue and send out.
481+
for (;;) {
482+
if ((msg = queue->dequeue()) == NULL) {
483+
break;
484+
}
485+
486+
// send out encoded msg.
487+
if ((ret = client->send_and_free_message(msg, stream_id)) != ERROR_SUCCESS) {
488+
return ret;
489+
}
490+
}
411491

412492
return ret;
413493
}

trunk/src/app/srs_app_mpegts_udp.hpp

+23
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
3434

3535
class sockaddr_in;
3636
#include <string>
37+
#include <map>
3738

3839
class SrsStream;
3940
class SrsTsContext;
@@ -43,6 +44,7 @@ class SrsRtmpClient;
4344
class SrsStSocket;
4445
class SrsRequest;
4546
class SrsRawH264Stream;
47+
class SrsSharedPtrMessage;
4648

4749
#include <srs_app_st.hpp>
4850
#include <srs_kernel_ts.hpp>
@@ -68,6 +70,26 @@ class ISrsUdpHandler
6870
virtual int on_udp_packet(sockaddr_in* from, char* buf, int nb_buf) = 0;
6971
};
7072

73+
/**
74+
* the queue for mpegts over udp to send packets.
75+
* for the aac in mpegts contains many flv packets in a pes packet,
76+
* we must recalc the timestamp.
77+
*/
78+
class SrsMpegtsQueue
79+
{
80+
private:
81+
// key: dts, value: msg.
82+
std::map<int64_t, SrsSharedPtrMessage*> msgs;
83+
int nb_audios;
84+
int nb_videos;
85+
public:
86+
SrsMpegtsQueue();
87+
virtual ~SrsMpegtsQueue();
88+
public:
89+
virtual int push(SrsSharedPtrMessage* msg);
90+
virtual SrsSharedPtrMessage* dequeue();
91+
};
92+
7193
/**
7294
* the mpegts over udp stream caster.
7395
*/
@@ -92,6 +114,7 @@ class SrsMpegtsOverUdp : virtual public ISrsTsHandler
92114
std::string h264_pps;
93115
bool h264_pps_changed;
94116
bool h264_sps_pps_sent;
117+
SrsMpegtsQueue* queue;
95118
public:
96119
SrsMpegtsOverUdp(SrsConfDirective* c);
97120
virtual ~SrsMpegtsOverUdp();

trunk/src/app/srs_app_source.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ using namespace std;
4040
#include <srs_kernel_stream.hpp>
4141
#include <srs_app_edge.hpp>
4242
#include <srs_kernel_utility.hpp>
43-
#include <srs_kernel_avc.hpp>
43+
#include <srs_kernel_codec.hpp>
4444
#include <srs_rtmp_msg_array.hpp>
4545

4646
#define CONST_MAX_JITTER_MS 500

0 commit comments

Comments
 (0)