Index: services/media/framework_ffmpeg/ffmpeg_demux.cc |
diff --git a/services/media/framework_ffmpeg/ffmpeg_demux.cc b/services/media/framework_ffmpeg/ffmpeg_demux.cc |
index b8825883dd3e8758071458b6970fbe9a4d9433d0..38b194daab6fe202254fa9e4b71b94f92829230f 100644 |
--- a/services/media/framework_ffmpeg/ffmpeg_demux.cc |
+++ b/services/media/framework_ffmpeg/ffmpeg_demux.cc |
@@ -6,6 +6,7 @@ |
#include "base/logging.h" |
#include "services/media/framework/safe_clone.h" |
+#include "services/media/framework_ffmpeg/av_packet.h" |
#include "services/media/framework_ffmpeg/ffmpeg_demux.h" |
#include "services/media/framework_ffmpeg/ffmpeg_io.h" |
#include "services/media/framework_ffmpeg/ffmpeg_type_converters.h" |
@@ -54,36 +55,29 @@ class FfmpegDemuxImpl : public FfmpegDemux { |
// Specialized packet implementation. |
class DemuxPacket : public Packet { |
public: |
- DemuxPacket() { |
- av_init_packet(&av_packet_); |
- } |
- |
- // Packet implementation. |
- int64_t presentation_time() const override { return av_packet_.pts; }; |
- |
- uint64_t duration() const override { return av_packet_.duration; }; |
- |
- bool end_of_stream() const override { return false; } |
- |
- size_t size() const override { return size_t(av_packet_.size); } |
- |
- void* payload() const override { |
- return reinterpret_cast<void*>(av_packet_.data); |
+ static PacketPtr Create(AvPacketPtr av_packet) { |
+ return PacketPtr(new DemuxPacket(std::move(av_packet))); |
} |
AVPacket& av_packet() { |
- return av_packet_; |
+ return *av_packet_; |
} |
protected: |
- ~DemuxPacket() override { |
- av_free_packet(&av_packet_); |
- } |
+ ~DemuxPacket() override {} |
void Release() override { delete this; } |
- private: |
- AVPacket av_packet_; |
+ private: |
+ DemuxPacket(AvPacketPtr av_packet) : |
+ Packet( |
+ av_packet->pts, |
johngro
2016/03/21 19:47:56
Since this is a place where we we are coming from
dalesat
2016/03/21 22:30:59
Done.
|
+ false, |
+ static_cast<size_t>(av_packet->size), |
johngro
2016/03/21 19:47:56
If this cast is required because av_packet->size i
dalesat
2016/03/21 22:30:59
Done.
|
+ av_packet->data), |
+ av_packet_(std::move(av_packet)) {} |
+ |
+ AvPacketPtr av_packet_; |
}; |
struct AVFormatContextDeleter { |
@@ -105,7 +99,7 @@ class FfmpegDemuxImpl : public FfmpegDemux { |
AvioContextPtr io_context_; |
std::vector<DemuxStream*> streams_; |
std::unique_ptr<Metadata> metadata_; |
- int64_t next_presentation_time_; |
+ int64_t next_pts_; |
int next_stream_to_end_ = -1; // -1: don't end, streams_.size(): stop. |
}; |
@@ -199,26 +193,23 @@ PacketPtr FfmpegDemuxImpl::PullPacket(size_t* stream_index_out) { |
return PullEndOfStreamPacket(stream_index_out); |
} |
- FfmpegDemuxImpl::DemuxPacket* demux_packet = |
- new FfmpegDemuxImpl::DemuxPacket(); |
+ AvPacketPtr av_packet = AvPacket::Create(); |
- demux_packet->av_packet().data = nullptr; |
- demux_packet->av_packet().size = 0; |
+ av_packet->data = nullptr; |
+ av_packet->size = 0; |
- if (av_read_frame(format_context_.get(), &demux_packet->av_packet()) < 0) { |
+ if (av_read_frame(format_context_.get(), av_packet.get()) < 0) { |
// End of stream. Start producing end-of-stream packets for all the streams. |
- PacketPtr(demux_packet); // Deletes demux_packet. |
next_stream_to_end_ = 0; |
return PullEndOfStreamPacket(stream_index_out); |
} |
*stream_index_out = |
- static_cast<size_t>(demux_packet->av_packet().stream_index); |
+ static_cast<size_t>(av_packet->stream_index); |
// TODO(dalesat): What if the packet has no PTS or duration? |
- next_presentation_time_ = |
- demux_packet->presentation_time() + demux_packet->duration(); |
+ next_pts_ = av_packet->pts + av_packet->duration; |
- return PacketPtr(demux_packet); |
+ return DemuxPacket::Create(std::move(av_packet)); |
} |
PacketPtr FfmpegDemuxImpl::PullEndOfStreamPacket(size_t* stream_index_out) { |
@@ -230,7 +221,7 @@ PacketPtr FfmpegDemuxImpl::PullEndOfStreamPacket(size_t* stream_index_out) { |
} |
*stream_index_out = next_stream_to_end_++; |
- return Packet::CreateEndOfStream(next_presentation_time_); |
+ return Packet::CreateEndOfStream(next_pts_); |
} |
void FfmpegDemuxImpl::CopyMetadata( |