mirror of
https://github.com/nyanmisaka/mpp.git
synced 2025-10-05 17:16:50 +08:00
[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:
@@ -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
|
||||||
*/
|
*/
|
||||||
|
@@ -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;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@@ -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;
|
|
||||||
MPP_RET ret = mpp_packet_new(&pkt);
|
|
||||||
if (MPP_OK == ret) {
|
|
||||||
MppPacketImpl *p = (MppPacketImpl *)pkt;
|
MppPacketImpl *p = (MppPacketImpl *)pkt;
|
||||||
memcpy(p, src, sizeof(*p));
|
memcpy(p, src_impl, sizeof(*src_impl));
|
||||||
p->data = p->pos = data;
|
p->data = p->pos = data;
|
||||||
p->size = p->length = size;
|
p->size = p->length = size;
|
||||||
p->flag |= MPP_PACKET_FLAG_INTERNAL;
|
p->flag |= MPP_PACKET_FLAG_INTERNAL;
|
||||||
if (size) {
|
if (size) {
|
||||||
memcpy(data, ((MppPacketImpl *)src)->data, size);
|
memcpy(data, src_impl->data, size);
|
||||||
}
|
}
|
||||||
*packet = pkt;
|
*packet = pkt;
|
||||||
return MPP_OK;
|
return MPP_OK;
|
||||||
}
|
|
||||||
|
|
||||||
mpp_err_f("malloc failed\n");
|
|
||||||
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) {
|
||||||
|
Reference in New Issue
Block a user