ZLMediaKit/src/Extension/Frame.cpp

109 lines
2.6 KiB
C++
Raw Normal View History

/*
2020-04-04 20:30:09 +08:00
* Copyright (c) 2016 The ZLMediaKit project authors. All Rights Reserved.
*
* This file is part of ZLMediaKit(https://github.com/xia-chu/ZLMediaKit).
*
2020-04-04 20:30:09 +08:00
* Use of this source code is governed by MIT license that can be found in the
* LICENSE file in the root of the source tree. All contributing project authors
* may be found in the AUTHORS file in the root of the source tree.
*/
#include "Frame.h"
using namespace std;
using namespace toolkit;
namespace mediakit{
2020-05-11 22:33:10 +08:00
/**
*
*/
class FrameCacheAble : public FrameFromPtr {
public:
typedef std::shared_ptr<FrameCacheAble> Ptr;
FrameCacheAble(const Frame::Ptr &frame){
if(frame->cacheAble()){
_frame = frame;
_ptr = frame->data();
}else{
_buffer = std::make_shared<BufferRaw>();
_buffer->assign(frame->data(),frame->size());
_ptr = _buffer->data();
}
_size = frame->size();
_dts = frame->dts();
_pts = frame->pts();
_prefix_size = frame->prefixSize();
2020-08-01 10:22:12 +08:00
_codec_id = frame->getCodecId();
2020-05-11 22:33:10 +08:00
_key = frame->keyFrame();
_config = frame->configFrame();
}
2020-08-01 10:22:12 +08:00
~FrameCacheAble() override = default;
2020-05-11 22:33:10 +08:00
/**
*
*/
bool cacheAble() const override {
return true;
}
bool keyFrame() const override{
return _key;
}
bool configFrame() const override{
return _config;
}
2020-08-01 10:22:12 +08:00
2020-05-11 22:33:10 +08:00
private:
bool _key;
bool _config;
Frame::Ptr _frame;
BufferRaw::Ptr _buffer;
2020-05-11 22:33:10 +08:00
};
Frame::Ptr Frame::getCacheAbleFrame(const Frame::Ptr &frame){
if(frame->cacheAble()){
return frame;
}
return std::make_shared<FrameCacheAble>(frame);
}
2020-03-08 21:19:20 +08:00
#define SWITCH_CASE(codec_id) case codec_id : return #codec_id
2020-05-15 18:08:54 +08:00
const char *getCodecName(CodecId codecId) {
switch (codecId) {
2020-03-08 21:19:20 +08:00
SWITCH_CASE(CodecH264);
SWITCH_CASE(CodecH265);
SWITCH_CASE(CodecAAC);
SWITCH_CASE(CodecG711A);
SWITCH_CASE(CodecG711U);
2020-05-11 22:33:10 +08:00
SWITCH_CASE(CodecOpus);
SWITCH_CASE(CodecL16);
2020-05-11 22:33:10 +08:00
default : return "unknown codec";
2020-03-08 21:19:20 +08:00
}
}
2020-05-15 18:08:54 +08:00
TrackType getTrackType(CodecId codecId){
switch (codecId){
2020-05-11 22:33:10 +08:00
case CodecH264:
case CodecH265: return TrackVideo;
case CodecAAC:
case CodecG711A:
case CodecG711U:
case CodecOpus:
case CodecL16: return TrackAudio;
2020-05-11 22:33:10 +08:00
default: return TrackInvalid;
}
}
2020-05-15 18:08:54 +08:00
const char *CodecInfo::getCodecName() {
return mediakit::getCodecName(getCodecId());
}
TrackType CodecInfo::getTrackType() {
return mediakit::getTrackType(getCodecId());
}
2020-05-11 22:33:10 +08:00
}//namespace mediakit