[mpp_packet]: add MppBuffer to MppPacket

git-svn-id: https://10.10.10.66:8443/svn/MediaProcessPlatform/trunk/mpp@852 6e48237b-75ef-9749-8fc9-41990f28c85a
This commit is contained in:
ChenHengming
2016-06-01 01:36:37 +00:00
parent cb1f526351
commit 31a488585e
3 changed files with 91 additions and 24 deletions

View File

@@ -17,8 +17,7 @@
#ifndef __MPP_PACKET_H__
#define __MPP_PACKET_H__
#include "rk_type.h"
#include "mpp_err.h"
#include "mpp_buffer.h"
typedef void* MppPacket;
@@ -34,6 +33,7 @@ extern "C" {
*/
MPP_RET mpp_packet_new(MppPacket *packet);
MPP_RET mpp_packet_init(MppPacket *packet, void *data, size_t size);
MPP_RET mpp_packet_init_with_buffer(MppPacket *packet, MppBuffer buffer);
MPP_RET mpp_packet_copy_init(MppPacket *packet, const MppPacket src);
MPP_RET mpp_packet_deinit(MppPacket *packet);
@@ -64,11 +64,13 @@ RK_S64 mpp_packet_get_dts(const MppPacket packet);
void mpp_packet_set_flag(MppPacket packet, RK_U32 flag);
RK_U32 mpp_packet_get_flag(const MppPacket packet);
MPP_RET mpp_packet_set_eos(MppPacket packet);
RK_U32 mpp_packet_get_eos(MppPacket packet);
MPP_RET mpp_packet_set_extra_data(MppPacket packet);
void mpp_packet_set_buffer(MppPacket packet, MppBuffer buffer);
MppBuffer mpp_packet_get_buffer(const MppPacket packet);
/*
* data access interface
*/

View File

@@ -17,8 +17,7 @@
#ifndef __MPP_IMPL_H__
#define __MPP_IMPL_H__
#include "rk_type.h"
#include "mpp_err.h"
#include "mpp_buffer.h"
#define MPP_PACKET_FLAG_EOS (0x00000001)
#define MPP_PACKET_FLAG_EXTRA_DATA (0x00000002)
@@ -46,6 +45,8 @@ typedef struct MppPacketImpl_t {
RK_S64 dts;
RK_U32 flag;
MppBuffer buffer;
} MppPacketImpl;
/*

View File

@@ -55,7 +55,7 @@ MPP_RET mpp_packet_new(MppPacket *packet)
MPP_RET mpp_packet_init(MppPacket *packet, void *data, size_t size)
{
if (NULL == packet) {
mpp_err_f("invalid NULL input packet\n", packet);
mpp_err_f("invalid NULL input packet\n");
return MPP_ERR_NULL_PTR;
}
@@ -71,6 +71,27 @@ MPP_RET mpp_packet_init(MppPacket *packet, void *data, size_t size)
return MPP_OK;
}
MPP_RET mpp_packet_init_with_buffer(MppPacket *packet, MppBuffer buffer)
{
if (NULL == packet || NULL == buffer) {
mpp_err_f("invalid input packet %p buffer %p\n", packet, buffer);
return MPP_ERR_NULL_PTR;
}
MPP_RET ret = mpp_packet_new(packet);
if (ret) {
mpp_err_f("new packet failed\n");
return ret;
}
MppPacketImpl *p = (MppPacketImpl *)*packet;
p->data = p->pos = mpp_buffer_get_ptr(buffer);
p->size = p->length = mpp_buffer_get_size(buffer);
p->buffer = buffer;
mpp_buffer_inc_ref(buffer);
return MPP_OK;
}
MPP_RET mpp_packet_copy_init(MppPacket *packet, const MppPacket src)
{
if (NULL == packet || NULL == src) {
@@ -78,33 +99,40 @@ MPP_RET mpp_packet_copy_init(MppPacket *packet, const MppPacket src)
return MPP_ERR_NULL_PTR;
}
check_mpp_packet_name((MppPacketImpl *)src);
MppPacketImpl *src_impl = (MppPacketImpl *)src;
check_mpp_packet_name(src_impl);
*packet = NULL;
MppPacket pkt;
MPP_RET ret = mpp_packet_new(&pkt);
if (ret)
return ret;
if (src_impl->buffer) {
/* if source packet has buffer just create a new reference to buffer */
memcpy(pkt, src_impl, sizeof(*src_impl));
mpp_buffer_inc_ref(src_impl->buffer);
return MPP_OK;
}
size_t size = mpp_packet_get_size(src);
void *data = mpp_malloc_size(void, size);
if (NULL == data) {
mpp_err_f("malloc failed, size %d\n", size);
mpp_packet_deinit(&pkt);
return MPP_ERR_MALLOC;
}
MppPacket pkt;
MPP_RET ret = mpp_packet_new(&pkt);
if (MPP_OK == ret) {
MppPacketImpl *p = (MppPacketImpl *)pkt;
memcpy(p, src, sizeof(*p));
p->data = p->pos = data;
p->size = p->length = size;
p->flag |= MPP_PACKET_FLAG_INTERNAL;
if (size) {
memcpy(data, ((MppPacketImpl *)src)->data, size);
}
*packet = pkt;
return MPP_OK;
MppPacketImpl *p = (MppPacketImpl *)pkt;
memcpy(p, src_impl, sizeof(*src_impl));
p->data = p->pos = data;
p->size = p->length = size;
p->flag |= MPP_PACKET_FLAG_INTERNAL;
if (size) {
memcpy(data, src_impl->data, size);
}
mpp_err_f("malloc failed\n");
mpp_free(data);
return ret;
*packet = pkt;
return MPP_OK;
}
MPP_RET mpp_packet_deinit(MppPacket *packet)
@@ -116,9 +144,15 @@ MPP_RET mpp_packet_deinit(MppPacket *packet)
MppPacketImpl *p = (MppPacketImpl *)(*packet);
check_mpp_packet_name(p);
/* release buffer reference */
if (p->buffer)
mpp_buffer_put(p->buffer);
if (p->flag & MPP_PACKET_FLAG_INTERNAL) {
mpp_free(p->data);
}
mpp_free(p);
*packet = NULL;
return MPP_OK;
@@ -192,6 +226,36 @@ MPP_RET mpp_packet_reset(MppPacketImpl *packet)
return MPP_OK;
}
void mpp_packet_set_buffer(MppPacket packet, MppBuffer buffer)
{
if (NULL == packet) {
mpp_err_f("found NULL input\n");
return ;
}
MppPacketImpl *p = (MppPacketImpl *)packet;
check_mpp_packet_name(p);
if (p->buffer) {
mpp_buffer_put(p->buffer);
}
p->buffer = buffer;
if (buffer) {
mpp_buffer_inc_ref(buffer);
}
}
MppBuffer mpp_packet_get_buffer(const MppPacket packet)
{
if (NULL == packet) {
mpp_err_f("found NULL input\n");
return NULL;
}
MppPacketImpl *p = (MppPacketImpl *)packet;
check_mpp_packet_name(p);
return p->buffer;
}
MPP_RET mpp_packet_read(MppPacket packet, size_t offset, void *data, size_t size)
{
if (NULL == packet || NULL == data) {