* suppoed to take care of)
*/
th_pkt_t *
-pkt_alloc(streaming_component_type_t type, const void *data, size_t datalen,
+pkt_alloc(streaming_component_type_t type, const uint8_t *data, size_t datalen,
int64_t pts, int64_t dts, int64_t pcr)
{
th_pkt_t *pkt;
+ pktbuf_t *payload;
+
+ if (datalen > 0) {
+ payload = pktbuf_alloc(data, datalen);
+ if (payload == NULL)
+ return NULL;
+ } else {
+ payload = NULL;
+ }
pkt = calloc(1, sizeof(th_pkt_t));
if (pkt) {
pkt->pkt_type = type;
- if(datalen)
- pkt->pkt_payload = pktbuf_alloc(data, datalen);
+ pkt->pkt_payload = payload;
pkt->pkt_dts = dts;
pkt->pkt_pts = pts;
pkt->pkt_pcr = pcr;
pkt->pkt_refcount = 1;
memoryinfo_alloc(&pkt_memoryinfo, sizeof(*pkt));
+ } else {
+ if (payload)
+ pktbuf_ref_dec(payload);
}
return pkt;
}
}
pktbuf_t *
-pktbuf_alloc(const void *data, size_t size)
+pktbuf_alloc(const uint8_t *data, size_t size)
{
- pktbuf_t *pb = malloc(sizeof(pktbuf_t));
-
- if (pb == NULL) return NULL;
+ pktbuf_t *pb;
+ uint8_t *buffer;
+
+ buffer = size > 0 ? malloc(size) : NULL;
+ if (buffer) {\
+ if (data != NULL)
+ memcpy(buffer, data, size);
+ } else if (size > 0) {
+ return NULL;
+ }
+ pb = malloc(sizeof(pktbuf_t));
+ if (pb == NULL) {
+ free(buffer);
+ return NULL;
+ }
pb->pb_refcount = 1;
+ pb->pb_data = buffer;
pb->pb_size = size;
pb->pb_err = 0;
- if(size > 0) {
- pb->pb_data = malloc(size);
- if (pb->pb_data != NULL) {
- if (data != NULL)
- memcpy(pb->pb_data, data, size);
- } else {
- pb->pb_size = 0;
- }
- } else {
- pb->pb_data = NULL;
- }
- memoryinfo_alloc(&pktbuf_memoryinfo, sizeof(*pb) + pb->pb_size);
+ memoryinfo_alloc(&pktbuf_memoryinfo, sizeof(*pb) + size);
return pb;
}
#define PKTREF_FOREACH(item, queue) TAILQ_FOREACH((item), (queue), pr_link)
th_pkt_t *pkt_alloc(streaming_component_type_t type,
- const void *data, size_t datalen,
+ const uint8_t *data, size_t datalen,
int64_t pts, int64_t dts, int64_t pcr);
th_pkt_t *pkt_copy_shallow(th_pkt_t *pkt);
pktbuf_t *pktbuf_ref_inc(pktbuf_t *pb);
-pktbuf_t *pktbuf_alloc(const void *data, size_t size);
+pktbuf_t *pktbuf_alloc(const uint8_t *data, size_t size);
pktbuf_t *pktbuf_make(void *data, size_t size);
#include "memutils.h"
-#include "memoryinfo.h"
-
#include <libavutil/mem.h>
return (ret < 0 || ret >= size) ? -1 : 0;
}
-
-/* meant to replace streaming_msg_create_pkt in streaming.h
- IMPORTANT: takes ownership of pkt */
-streaming_message_t *
-msg_create(th_pkt_t *pkt)
-{
- static const size_t msg_size = sizeof(streaming_message_t);
- streaming_message_t *msg = NULL;
-
- if ((msg = calloc(1, msg_size))) {
- msg->sm_type = SMT_PACKET;
-#if ENABLE_TIMESHIFT
- msg->sm_time = 0;
-#endif
- msg->sm_data = pkt; // takes ownership
- }
- else {
- TVHPKT_DECREF(pkt);
- }
- return msg;
-}
-
-
/* _IMPORTANT!_: need to check for pb->pb_size and pb->pb_data
_BEFORE_ calling pktbuf_copy_data */
uint8_t *
}
return data;
}
-
-
-/* meant to replace pktbuf_alloc in packet.h */
-pktbuf_t *
-pktbuf_create(const uint8_t *data, size_t size)
-{
- static const size_t pktbuf_size = sizeof(pktbuf_t);
- pktbuf_t *pktbuf = NULL;
- uint8_t *buffer = NULL;
-
- if (size) {
- if (!(buffer = calloc(1, size))) {
- return NULL;
- }
- else if (data) {
- memcpy(buffer, data, size);
- }
- }
- if ((pktbuf = calloc(1, pktbuf_size))) {
- pktbuf->pb_refcount = 1;
- pktbuf->pb_err = 0;
- pktbuf->pb_data = buffer;
- pktbuf->pb_size = size;
- memoryinfo_alloc(&pktbuf_memoryinfo, pktbuf_size + pktbuf->pb_size);
- }
- else if (buffer) {
- free(buffer);
- buffer = NULL;
- }
- return pktbuf;
-}
-
-
-/* meant to replace pkt_alloc in packet.h */
-th_pkt_t *
-pkt_create(const uint8_t *data, size_t size, int64_t pts, int64_t dts)
-{
- static const size_t pkt_size = sizeof(th_pkt_t);
- th_pkt_t *pkt = NULL;
- pktbuf_t *payload = NULL;
-
- if (size && !(payload = pktbuf_create(data, size))) {
- return NULL;
- }
- if ((pkt = calloc(1, pkt_size))) {
- pkt->pkt_refcount = 1;
- pkt->pkt_pts = pts;
- pkt->pkt_dts = dts;
- pkt->pkt_payload = payload;
- memoryinfo_alloc(&pkt_memoryinfo, pkt_size);
- }
- else if (payload) {
- pktbuf_ref_dec(payload);
- payload = NULL;
- }
- return pkt;
-}
int
str_snprintf(char *str, size_t size, const char *format, ...);
-
-streaming_message_t *
-msg_create(th_pkt_t *pkt);
-
/* _IMPORTANT!_: need to check for pb->pb_size and pb->pb_data
_BEFORE_ calling pktbuf_copy_data */
uint8_t *
pktbuf_copy_data(pktbuf_t *pb);
-pktbuf_t *
-pktbuf_create(const uint8_t *data, size_t size);
-
-th_pkt_t *
-pkt_create(const uint8_t *data, size_t size, int64_t pts, int64_t dts);
-
-
#endif // TVH_TRANSCODING_MEMUTILS_H__
self->require_meta = self->helper->meta(self, avpkt, pkt);
}
else if (self->oavctx->extradata_size) {
- pkt->pkt_meta = pktbuf_create(self->oavctx->extradata,
- self->oavctx->extradata_size);
+ pkt->pkt_meta = pktbuf_alloc(self->oavctx->extradata,
+ self->oavctx->extradata_size);
self->require_meta = (pkt->pkt_meta) ? 0 : -1;
}
}
pkt = self->helper->pack(self, avpkt);
}
else {
- pkt = pkt_create(avpkt->data, avpkt->size, avpkt->pts, avpkt->dts);
+ pkt = pkt_alloc(self->stream->type, avpkt->data, avpkt->size, avpkt->pts, avpkt->dts, 0);
}
if (!pkt) {
tvh_context_log(self, LOG_ERR, "failed to create packet");
return -1;
}
size += 8;
- if (!(pkt->pkt_meta = pktbuf_create(data, size))) {
+ if (!(pkt->pkt_meta = pktbuf_alloc(data, size))) {
return -1;
}
return 0;
break;
}
if (size) {
- if (!(pkt->pkt_meta = pktbuf_create(avpkt->data, size))) {
+ if (!(pkt->pkt_meta = pktbuf_alloc(avpkt->data, size))) {
return -1;
}
return 0;
break;
}
if (size) {
- if (!(pkt->pkt_meta = pktbuf_create(avpkt->data, size))) {
+ if (!(pkt->pkt_meta = pktbuf_alloc(avpkt->data, size))) {
return -1;
}
return 0;
tvh_context_log(self, LOG_ERR, "aac frame data too big");
}
else if (avpkt->data[0] != 0xff || (avpkt->data[1] & 0xf0) != 0xf0) {
- if ((pkt = pkt_create(NULL, pkt_size, avpkt->pts, avpkt->dts))) {
+ if ((pkt = pkt_alloc(self->stream->type, NULL, pkt_size, avpkt->pts, avpkt->dts, 0))) {
tvh_aac_pack_adts_header(self, pkt->pkt_payload);
memcpy(pktbuf_ptr(pkt->pkt_payload) + header_size,
avpkt->data, avpkt->size);
}
}
else {
- pkt = pkt_create(avpkt->data, avpkt->size, avpkt->pts, avpkt->dts);
+ pkt = pkt_alloc(self->stream->type, avpkt->data, avpkt->size, avpkt->pts, avpkt->dts, 0);
}
return pkt;
}
{
tvh_sm_t *msg = NULL;
- if (!(msg = msg_create(pkt))) { // takes ownership of pkt
+ if (!(msg = streaming_msg_create_pkt(pkt))) { // takes ownership of pkt
tvh_transcoder_log(self, LOG_ERR, "failed to create message");
return -1;
}
/* the video packets might be delayed */
th_pkt_t *pkt = NULL;
- pkt = pkt_create(NULL, 0, self->src_pkt->pkt_pts, self->src_pkt->pkt_dts);
+ pkt = pkt_alloc(self->stream->type, NULL, 0,
+ self->src_pkt->pkt_pts,
+ self->src_pkt->pkt_dts,
+ self->src_pkt->pkt_pcr);
if (pkt) {
return tvh_context_deliver(self, pkt);
}