mirror of
https://github.com/tuxbox-neutrino/libstb-hal.git
synced 2025-08-26 23:13:16 +02:00
96 lines
2.5 KiB
C
96 lines
2.5 KiB
C
//
|
|
// more info
|
|
// http://forum.doom9.org/archive/index.php/t-157998.html
|
|
//
|
|
|
|
#include "flv2mpeg4/flv2mpeg4.h"
|
|
|
|
|
|
typedef struct
|
|
{
|
|
flv2mpeg4_CTX *ctx;
|
|
uint8_t *extradata;
|
|
int extradatasize;
|
|
|
|
Context_t *out_ctx;
|
|
Track_t *track;
|
|
} Flv2Mpeg4Context;
|
|
|
|
|
|
static int flv2mpeg4_context_write_packet_cb(void *usr_data, int keyframe __attribute__((unused)), int pts __attribute__((unused)), const uint8_t *buf, int size)
|
|
{
|
|
Flv2Mpeg4Context *ctx = usr_data;
|
|
if (!ctx)
|
|
{
|
|
return -1;
|
|
}
|
|
|
|
AudioVideoOut_t avOut;
|
|
avOut.data = (char *)buf;
|
|
avOut.len = size;
|
|
avOut.pts = ctx->track->pts;
|
|
avOut.dts = ctx->track->dts;
|
|
avOut.extradata = ctx->extradata;
|
|
avOut.extralen = ctx->extradatasize;
|
|
avOut.frameRate = ctx->track->frame_rate;
|
|
avOut.timeScale = ctx->track->TimeScale;
|
|
avOut.width = ctx->track->width;
|
|
avOut.height = ctx->track->height;
|
|
avOut.type = "video";
|
|
|
|
if (Write(ctx->out_ctx->output->video->Write, ctx->out_ctx, &avOut, avOut.pts) < 0)
|
|
{
|
|
ffmpeg_err("writing data to video device failed\n");
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
static int flv2mpeg4_context_write_extradata_cb(void *usr_data, int width __attribute__((unused)), int height __attribute__((unused)), int bitrate __attribute__((unused)), const uint8_t *extradata, int extradatasize)
|
|
{
|
|
Flv2Mpeg4Context *ctx = usr_data;
|
|
if (!ctx)
|
|
{
|
|
return -1;
|
|
}
|
|
|
|
free(ctx->extradata);
|
|
ctx->extradata = malloc(extradatasize);
|
|
memcpy(ctx->extradata, extradata, extradatasize);
|
|
ctx->extradatasize = extradatasize;
|
|
|
|
return 0;
|
|
}
|
|
|
|
static void flv2mpeg4_context_reset(Flv2Mpeg4Context *context)
|
|
{
|
|
if (context == NULL || context->ctx == NULL)
|
|
return;
|
|
|
|
flv2mpeg4_set_frame(context->ctx, 0, 0);
|
|
}
|
|
|
|
static int flv2mpeg4_write_packet(Context_t *out_ctx, Flv2Mpeg4Context *mpeg4p2_ctx, Track_t *track, int cAVIdx, int64_t *pts_current, int64_t *pts_latest, AVPacket *pkt)
|
|
{
|
|
if (!mpeg4p2_ctx->ctx)
|
|
{
|
|
mpeg4p2_ctx->ctx = flv2mpeg4_init_ctx(mpeg4p2_ctx, track->width, track->height, flv2mpeg4_context_write_packet_cb, flv2mpeg4_context_write_extradata_cb);
|
|
flv2mpeg4_prepare_extra_data(mpeg4p2_ctx->ctx);
|
|
}
|
|
|
|
*pts_current = track->pts = calcPts(cAVIdx, track->stream, pkt->pts);
|
|
if ((*pts_current > *pts_latest) && (*pts_current != INVALID_PTS_VALUE))
|
|
{
|
|
*pts_latest = *pts_current;
|
|
}
|
|
track->dts = calcPts(cAVIdx, track->stream, pkt->dts);
|
|
|
|
mpeg4p2_ctx->out_ctx = out_ctx;
|
|
mpeg4p2_ctx->track = track;
|
|
|
|
uint32_t time_ms = (uint32_t)(track->pts / 90);
|
|
|
|
return flv2mpeg4_process_flv_packet(mpeg4p2_ctx->ctx, 0, pkt->data, pkt->size, time_ms);
|
|
}
|
|
|