[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__ #ifndef __MPP_PACKET_H__
#define __MPP_PACKET_H__ #define __MPP_PACKET_H__
#include "rk_type.h" #include "mpp_buffer.h"
#include "mpp_err.h"
typedef void* MppPacket; typedef void* MppPacket;
@@ -34,6 +33,7 @@ extern "C" {
*/ */
MPP_RET mpp_packet_new(MppPacket *packet); MPP_RET mpp_packet_new(MppPacket *packet);
MPP_RET mpp_packet_init(MppPacket *packet, void *data, size_t size); 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_copy_init(MppPacket *packet, const MppPacket src);
MPP_RET mpp_packet_deinit(MppPacket *packet); 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); void mpp_packet_set_flag(MppPacket packet, RK_U32 flag);
RK_U32 mpp_packet_get_flag(const MppPacket packet); RK_U32 mpp_packet_get_flag(const MppPacket packet);
MPP_RET mpp_packet_set_eos(MppPacket packet); MPP_RET mpp_packet_set_eos(MppPacket packet);
RK_U32 mpp_packet_get_eos(MppPacket packet); RK_U32 mpp_packet_get_eos(MppPacket packet);
MPP_RET mpp_packet_set_extra_data(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 * data access interface
*/ */

View File

@@ -17,8 +17,7 @@
#ifndef __MPP_IMPL_H__ #ifndef __MPP_IMPL_H__
#define __MPP_IMPL_H__ #define __MPP_IMPL_H__
#include "rk_type.h" #include "mpp_buffer.h"
#include "mpp_err.h"
#define MPP_PACKET_FLAG_EOS (0x00000001) #define MPP_PACKET_FLAG_EOS (0x00000001)
#define MPP_PACKET_FLAG_EXTRA_DATA (0x00000002) #define MPP_PACKET_FLAG_EXTRA_DATA (0x00000002)
@@ -46,6 +45,8 @@ typedef struct MppPacketImpl_t {
RK_S64 dts; RK_S64 dts;
RK_U32 flag; RK_U32 flag;
MppBuffer buffer;
} MppPacketImpl; } 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) MPP_RET mpp_packet_init(MppPacket *packet, void *data, size_t size)
{ {
if (NULL == packet) { 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; return MPP_ERR_NULL_PTR;
} }
@@ -71,6 +71,27 @@ MPP_RET mpp_packet_init(MppPacket *packet, void *data, size_t size)
return MPP_OK; 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) MPP_RET mpp_packet_copy_init(MppPacket *packet, const MppPacket src)
{ {
if (NULL == packet || NULL == 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; return MPP_ERR_NULL_PTR;
} }
check_mpp_packet_name((MppPacketImpl *)src); MppPacketImpl *src_impl = (MppPacketImpl *)src;
check_mpp_packet_name(src_impl);
*packet = NULL; *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); size_t size = mpp_packet_get_size(src);
void *data = mpp_malloc_size(void, size); void *data = mpp_malloc_size(void, size);
if (NULL == data) { if (NULL == data) {
mpp_err_f("malloc failed, size %d\n", size); mpp_err_f("malloc failed, size %d\n", size);
mpp_packet_deinit(&pkt);
return MPP_ERR_MALLOC; return MPP_ERR_MALLOC;
} }
MppPacket pkt; MppPacketImpl *p = (MppPacketImpl *)pkt;
MPP_RET ret = mpp_packet_new(&pkt); memcpy(p, src_impl, sizeof(*src_impl));
if (MPP_OK == ret) { p->data = p->pos = data;
MppPacketImpl *p = (MppPacketImpl *)pkt; p->size = p->length = size;
memcpy(p, src, sizeof(*p)); p->flag |= MPP_PACKET_FLAG_INTERNAL;
p->data = p->pos = data; if (size) {
p->size = p->length = size; memcpy(data, src_impl->data, size);
p->flag |= MPP_PACKET_FLAG_INTERNAL;
if (size) {
memcpy(data, ((MppPacketImpl *)src)->data, size);
}
*packet = pkt;
return MPP_OK;
} }
*packet = pkt;
mpp_err_f("malloc failed\n"); return MPP_OK;
mpp_free(data);
return ret;
} }
MPP_RET mpp_packet_deinit(MppPacket *packet) MPP_RET mpp_packet_deinit(MppPacket *packet)
@@ -116,9 +144,15 @@ MPP_RET mpp_packet_deinit(MppPacket *packet)
MppPacketImpl *p = (MppPacketImpl *)(*packet); MppPacketImpl *p = (MppPacketImpl *)(*packet);
check_mpp_packet_name(p); check_mpp_packet_name(p);
/* release buffer reference */
if (p->buffer)
mpp_buffer_put(p->buffer);
if (p->flag & MPP_PACKET_FLAG_INTERNAL) { if (p->flag & MPP_PACKET_FLAG_INTERNAL) {
mpp_free(p->data); mpp_free(p->data);
} }
mpp_free(p); mpp_free(p);
*packet = NULL; *packet = NULL;
return MPP_OK; return MPP_OK;
@@ -192,6 +226,36 @@ MPP_RET mpp_packet_reset(MppPacketImpl *packet)
return MPP_OK; 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) MPP_RET mpp_packet_read(MppPacket packet, size_t offset, void *data, size_t size)
{ {
if (NULL == packet || NULL == data) { if (NULL == packet || NULL == data) {