这章是FFMPEG C++封装库的详细设计。
该模块是编码后数据包类型。
namespace media
{
namespace sdk
{
typedef int PacketType;
PacketType const PacketType_Audio = 0;
PacketType const PacketType_Video = 1;
PacketType const PacketType_Subtitle = 2;
PacketType const PacketType_Data = 3;
PacketType const PacketType_None = 4;
struct MEDIASDK_EXPORT Rational
{
Rational() : num(1), den(1){}
Rational(int n, int d) : num(n) , den(d) {}
bool operator ==(Rational const& r) const
{
return num == r.num && den == r.den;
}
bool operator !=(Rational const& r) const
{
return !(*this == r);
}
int num;
int den;
};
typedef struct PacketHandle* PacketHandlePtr;
struct MEDIASDK_EXPORT Packet
{
Packet();
Packet(Packet const&) = delete;
~Packet();
Packet& operator = (Packet const&) = delete;
static int64_t ToTime(int64_t const& pts, Rational const& timebase);
typedef std::shared_ptr<Packet> Ptr;
PacketType type() const;
bool is_empty() const;
bool is_keyframe() const;
bool is_badframe() const;
int64_t pts() const;
int64_t dts() const;
int64_t original_pts() const;
int64_t original_dts() const;
int64_t pos() const;
int64_t duration() const;
int64_t next_dts() const;
void offset_time(int64_t const& offset);
void modify_time(Rational const& timebase1, Rational const& timebase2);
const uint8_t *data() const;
int size() const;
int stream_index() const;
void reset();
private:
PacketHandlePtr handle();
void type(PacketType type);
friend struct IStream;
friend struct OStream;
friend struct VideoDecoder;
friend struct AudioDecoder;
friend struct VideoEncoder;
friend struct AudioEncoder;
// noncopyable:
Packet( Packet& );
void operator = ( Packet& );
PacketHandlePtr handle_;
};
typedef Packet::Ptr PacketPtr;
}
}
类型说明:
extern "C"
{
#include
}
namespace media
{
namespace sdk
{
struct PacketHandle
{
PacketHandle()
: packet(new AVPacket())
, type(PacketType_None)
{
av_init_packet(packet);
packet->data = 0;
packet->size = 0;
original_pts = packet->pts;
original_dts = packet->dts;
}
~PacketHandle()
{
av_packet_unref(packet);
}
AVPacket* packet;
PacketType type;
int64_t original_pts;
int64_t original_dts;
};
}
}
函数说明:
namespace media
{
namespace sdk
{
Packet::Packet()
: handle_(new PacketHandle())
{
}
Packet::~Packet()
{
delete handle_;
}
int64_t Packet::ToTime(int64_t const& pts, Rational const& timebase)
{
AVRational tb1 = {timebase.num, timebase.den};
AVRational tb2 = {1, AV_TIME_BASE};
return av_rescale_q(pts, tb1, tb2);
}
void Packet::reset()
{
av_packet_unref(handle_->packet);
av_init_packet(handle_->packet);
}
PacketType Packet::type() const
{
return handle_->type;
}
bool Packet::is_empty() const
{
return (handle_->packet->data == 0) ? true : false;
}
bool Packet::is_keyframe() const
{
if(handle_->packet->flags & AV_PKT_FLAG_KEY)
return true;
return false;
}
bool Packet::is_badframe() const
{
if(handle_->packet->flags & AV_PKT_FLAG_CORRUPT)
return true;
return false;
}
int64_t Packet::pts() const
{
return handle_->packet->pts;
}
int64_t Packet::dts() const
{
return handle_->packet->dts;
}
int64_t Packet::original_pts() const
{
return handle_->original_pts;
}
int64_t Packet::original_dts() const
{
return handle_->original_dts;
}
int64_t Packet::duration() const
{
return handle_->packet->duration;
}
int64_t Packet::next_dts() const
{
return handle_->packet->dts + handle_->packet->duration;
}
void Packet::offset_time(int64_t const& offset)
{
if(handle_->packet)
{
handle_->packet->dts += offset;
handle_->packet->pts += offset;
}
}
void Packet::modify_time(Rational const& timebase1, Rational const& timebase2)
{
if(timebase1 == timebase2)
return;
AVRational tb1 = {timebase1.num, timebase1.den};
AVRational tb2 = {timebase2.num, timebase2.den};
handle_->packet->dts = av_rescale_q(handle_->packet->dts, tb1, tb2);
handle_->packet->pts = av_rescale_q(handle_->packet->pts, tb1, tb2);
handle_->packet->duration = av_rescale_q(handle_->packet->duration, tb1, tb2);
}
int64_t Packet::pos() const
{
return handle_->packet->pos;
}
const uint8_t *Packet::data() const
{
return handle_->packet->data;
}
int Packet::size() const
{
return handle_->packet->size;
}
int Packet::stream_index() const
{
return handle_->packet->stream_index;
}
void Packet::type(PacketType t)
{
handle_->type = t;
}
PacketHandlePtr Packet::handle()
{
return handle_;
}
}
}
说明:
未完待续…