Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mpc-hc/LAVFilters.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHendrik Leppkes <h.leppkes@gmail.com>2016-07-11 01:01:45 +0300
committerHendrik Leppkes <h.leppkes@gmail.com>2016-07-11 01:01:45 +0300
commit45f77f25bef884df373da65bbf303ac6b06a1975 (patch)
tree1ced41558373ac73613c391207cc537d5601e1f3 /demuxer
parentd0d5e39f4e9b04b8e02d7e99c7056391dd7971ef (diff)
Re-implement the Packet struct, based more closely on a backing AVPacket
Diffstat (limited to 'demuxer')
-rw-r--r--demuxer/Demuxers/Packet.cpp61
-rw-r--r--demuxer/Demuxers/Packet.h11
2 files changed, 32 insertions, 40 deletions
diff --git a/demuxer/Demuxers/Packet.cpp b/demuxer/Demuxers/Packet.cpp
index 5d0f2d2f..4e466363 100644
--- a/demuxer/Demuxers/Packet.cpp
+++ b/demuxer/Demuxers/Packet.cpp
@@ -27,7 +27,7 @@ Packet::Packet()
Packet::~Packet()
{
DeleteMediaType(pmt);
- av_buffer_unref(&m_Buf);
+ av_packet_free(&m_Packet);
}
int Packet::SetDataSize(size_t len)
@@ -35,23 +35,21 @@ int Packet::SetDataSize(size_t len)
if (len < 0)
return -1;
- // RemoveHead may have moved m_Data, make sure the data moved too.
- if (m_Buf && m_Buf->data != m_Data) {
- ptrdiff_t offset = m_Data - m_Buf->data;
- if (av_buffer_make_writable(&m_Buf) < 0)
- return -1;
-
- memmove(m_Buf->data, m_Buf->data + offset, m_DataSize);
+ if (len <= GetDataSize()) {
+ av_shrink_packet(m_Packet, len);
+ return 0;
}
- // Re-allocate the buffer, if required
- if (!m_Buf || (size_t)m_Buf->size < (len + FF_INPUT_BUFFER_PADDING_SIZE)) {
- int ret = av_buffer_realloc(&m_Buf, (int)len + FF_INPUT_BUFFER_PADDING_SIZE);
- if (ret < 0)
- return ret;
+ if (!m_Packet) {
+ m_Packet = av_packet_alloc();
+ if (av_new_packet(m_Packet, len) < 0)
+ return -1;
+ }
+ else
+ {
+ if (av_grow_packet(m_Packet, (len - m_Packet->size)) < 0)
+ return -1;
}
- m_Data = m_Buf->data;
- m_DataSize = len;
return 0;
}
@@ -64,23 +62,19 @@ int Packet::SetData(const void* ptr, size_t len)
if (ret < 0)
return ret;
- memcpy(m_Data, ptr, len);
+ memcpy(m_Packet->data, ptr, len);
return 0;
}
int Packet::SetPacket(AVPacket *pkt)
{
- if (pkt->buf) {
- ASSERT(!m_Buf);
- m_Buf = av_buffer_ref(pkt->buf);
- if (!m_Buf)
- return -1;
- m_Data = m_Buf->data;
- m_DataSize = pkt->size;
- return 0;
- } else {
- return SetData(pkt->data, pkt->size);
- }
+ ASSERT(!m_Packet);
+
+ m_Packet = av_packet_alloc();
+ if (!m_Packet)
+ return -1;
+
+ return av_packet_ref(m_Packet, pkt);
}
int Packet::Append(Packet *ptr)
@@ -90,20 +84,17 @@ int Packet::Append(Packet *ptr)
int Packet::AppendData(const void* ptr, size_t len)
{
- size_t prevSize = m_DataSize;
- int ret = SetDataSize(m_DataSize + len);
+ size_t prevSize = GetDataSize();
+ int ret = SetDataSize(prevSize + len);
if (ret < 0)
return ret;
- memcpy(m_Data+prevSize, ptr, len);
+ memcpy(m_Packet->data+prevSize, ptr, len);
return 0;
}
int Packet::RemoveHead(size_t count)
{
- count = min(count, m_DataSize);
- if (!m_Data || count < 0)
- return -1;
- m_Data += count;
- m_DataSize -= count;
+ m_Packet->data += count;
+ m_Packet->size -= count;
return 0;
}
diff --git a/demuxer/Demuxers/Packet.h b/demuxer/Demuxers/Packet.h
index ff66ec27..ea989a0d 100644
--- a/demuxer/Demuxers/Packet.h
+++ b/demuxer/Demuxers/Packet.h
@@ -28,8 +28,11 @@ public:
Packet();
~Packet();
- size_t GetDataSize() const { return m_DataSize; }
- BYTE *GetData() { return m_Data; }
+ size_t GetDataSize() const { return m_Packet ? m_Packet->size : 0; }
+ BYTE *GetData() { return m_Packet ? m_Packet->data : nullptr; }
+
+ int GetNumSideData() const { return m_Packet ? m_Packet->side_data_elems : 0; }
+ AVPacketSideData* GetSideData() { return m_Packet ? m_Packet->side_data : nullptr; }
int SetDataSize(size_t len);
int SetData(const void* ptr, size_t len);
@@ -63,7 +66,5 @@ public:
DWORD dwFlags = 0;
private:
- size_t m_DataSize = 0;
- BYTE *m_Data = nullptr;
- AVBufferRef *m_Buf = nullptr;
+ AVPacket *m_Packet = nullptr;
};