mirror of
https://github.com/ossrs/srs.git
synced 2025-03-09 15:49:59 +00:00
for #738, support srs ingest mp4
This commit is contained in:
parent
4fe79a1025
commit
31191f2650
2 changed files with 40 additions and 4 deletions
|
@ -28,6 +28,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|||
#include <srs_kernel_stream.hpp>
|
||||
#include <srs_core_autofree.hpp>
|
||||
#include <srs_kernel_io.hpp>
|
||||
#include <srs_kernel_utility.hpp>
|
||||
#include <srs_kernel_buffer.hpp>
|
||||
|
||||
#include <string.h>
|
||||
|
@ -3177,6 +3178,7 @@ SrsMp4Sample::SrsMp4Sample()
|
|||
data = NULL;
|
||||
frame_type = SrsCodecVideoAVCFrameForbidden;
|
||||
tbn = 0;
|
||||
adjust = 0;
|
||||
}
|
||||
|
||||
SrsMp4Sample::~SrsMp4Sample()
|
||||
|
@ -3186,12 +3188,12 @@ SrsMp4Sample::~SrsMp4Sample()
|
|||
|
||||
uint32_t SrsMp4Sample::dts_ms()
|
||||
{
|
||||
return (uint32_t)(dts * 1000 / tbn);
|
||||
return (uint32_t)(dts * 1000 / tbn) + adjust;
|
||||
}
|
||||
|
||||
uint32_t SrsMp4Sample::pts_ms()
|
||||
{
|
||||
return (uint32_t)(pts * 1000 / tbn);
|
||||
return (uint32_t)(pts * 1000 / tbn) + adjust;
|
||||
}
|
||||
|
||||
SrsMp4SampleManager::SrsMp4SampleManager()
|
||||
|
@ -3226,11 +3228,42 @@ int SrsMp4SampleManager::load(SrsMp4MovieBox* moov)
|
|||
}
|
||||
|
||||
// Dumps temp samples.
|
||||
// Adjust the sequence diff.
|
||||
int32_t maxp = 0;
|
||||
int32_t maxn = 0;
|
||||
if (true) {
|
||||
uint32_t tbn = 0;
|
||||
SrsMp4Sample* pvideo = NULL;
|
||||
map<uint64_t, SrsMp4Sample*>::iterator it;
|
||||
for (it = tses.begin(); it != tses.end(); ++it) {
|
||||
SrsMp4Sample* sample = it->second;
|
||||
samples.push_back(sample);
|
||||
|
||||
if (sample->type == SrsCodecFlvTagVideo) {
|
||||
pvideo = sample;
|
||||
} else if (pvideo) {
|
||||
tbn = sample->tbn;
|
||||
int32_t diff = sample->dts_ms() - pvideo->dts_ms();
|
||||
if (diff > 0) {
|
||||
maxp = srs_max(maxp, diff);
|
||||
} else {
|
||||
maxn = srs_min(maxn, diff);
|
||||
}
|
||||
pvideo = NULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Adjust when one of maxp and maxn is zero,
|
||||
// that means we can adjust by add maxn or sub maxp,
|
||||
// notice that maxn is negative and maxp is positive.
|
||||
if (maxp * maxn == 0 && maxp + maxn != 0) {
|
||||
map<uint64_t, SrsMp4Sample*>::iterator it;
|
||||
for (it = tses.begin(); it != tses.end(); ++it) {
|
||||
SrsMp4Sample* sample = it->second;
|
||||
if (sample->type == SrsCodecFlvTagAudio) {
|
||||
sample->adjust = 0 - maxp - maxn;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -1427,6 +1427,9 @@ public:
|
|||
uint32_t tbn;
|
||||
// For video, the frame type, whether keyframe.
|
||||
SrsCodecVideoAVCFrame frame_type;
|
||||
// The adjust timestamp in milliseconds.
|
||||
// For example, we can adjust a timestamp for A/V to monotonically increase.
|
||||
int32_t adjust;
|
||||
// The sample data.
|
||||
uint32_t nb_data;
|
||||
uint8_t* data;
|
||||
|
@ -1434,9 +1437,9 @@ public:
|
|||
SrsMp4Sample();
|
||||
virtual ~SrsMp4Sample();
|
||||
public:
|
||||
// Get the dts in ms.
|
||||
// Get the adjusted dts in ms.
|
||||
virtual uint32_t dts_ms();
|
||||
// Get the pts in ms.
|
||||
// Get the adjusted pts in ms.
|
||||
virtual uint32_t pts_ms();
|
||||
};
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue