添加track在创建后input frame前回调,避免track订阅错过配置帧数据,MP4Demuxer接口添加virtual可派生扩展

This commit is contained in:
baiyfcu 2024-04-03 14:46:33 +08:00
parent 584944d777
commit 6b1b9f3e35
2 changed files with 18 additions and 8 deletions

View File

@ -63,6 +63,8 @@ void MP4Demuxer::onVideoTrack(uint32_t track, uint8_t object, int width, int hei
}
video->setIndex(track);
_tracks.emplace(track, video);
if (_on_track_callback)
_on_track_callback(video);
if (extra && bytes) {
video->setExtraData((uint8_t *)extra, bytes);
}
@ -75,6 +77,8 @@ void MP4Demuxer::onAudioTrack(uint32_t track, uint8_t object, int channel_count,
}
audio->setIndex(track);
_tracks.emplace(track, audio);
if (_on_track_callback)
_on_track_callback(audio);
if (extra && bytes) {
audio->setExtraData((uint8_t *)extra, bytes);
}
@ -100,7 +104,10 @@ struct Context {
Frame::Ptr MP4Demuxer::readFrame(bool &keyFrame, bool &eof) {
keyFrame = false;
eof = false;
if (!_mov_reader) {
eof = true;
return nullptr;
}
static mov_reader_onread2 mov_onalloc = [](void *param, uint32_t track_id, size_t bytes, int64_t pts, int64_t dts, int flags) -> void * {
Context *ctx = (Context *) param;
ctx->pts = pts;

View File

@ -20,25 +20,25 @@ class MP4Demuxer : public TrackSource {
public:
using Ptr = std::shared_ptr<MP4Demuxer>;
~MP4Demuxer() override;
virtual ~MP4Demuxer() override;
/**
*
* @param file mp4文件路径
*/
void openMP4(const std::string &file);
virtual void openMP4(const std::string &file);
/**
* @brief mp4
*/
void closeMP4();
virtual void closeMP4();
/**
*
* @param stamp_ms
* @return
*/
int64_t seekTo(int64_t stamp_ms);
virtual int64_t seekTo(int64_t stamp_ms);
/**
*
@ -46,20 +46,22 @@ public:
* @param eof
* @return ,
*/
Frame::Ptr readFrame(bool &keyFrame, bool &eof);
virtual Frame::Ptr readFrame(bool &keyFrame, bool &eof);
/**
* Track信息
* @param trackReady track为就绪状态
* @return Track
*/
std::vector<Track::Ptr> getTracks(bool trackReady) const override;
virtual std::vector<Track::Ptr> getTracks(bool trackReady) const override;
/**
*
* @return
*/
uint64_t getDurationMS() const;
virtual uint64_t getDurationMS() const;
virtual void setOnTrack(const std::function<void(Track::Ptr &track)> &callback) { _on_track_callback = callback; }
private:
int getAllTracks();
@ -73,6 +75,7 @@ private:
uint64_t _duration_ms = 0;
std::unordered_map<int, Track::Ptr> _tracks;
toolkit::ResourcePool<toolkit::BufferRaw> _buffer_pool;
std::function<void(Track::Ptr &track)> _on_track_callback;
};