添加track在创建后input frame前回调,避免track订阅错过配置帧数据,MP4Demuxer接口添加virtual可派生扩展
This commit is contained in:
parent
584944d777
commit
6b1b9f3e35
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
};
|
||||
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue