mirror of
https://github.com/xenia-project/FFmpeg.git
synced 2024-11-24 20:19:55 +00:00
avcodec/a64multienc: simplify frame handling code
This also fixes a memleak Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
parent
87513d6545
commit
4da351ff0c
@ -65,7 +65,7 @@ static const int mc_colors[5]={0x0,0xb,0xc,0xf,0x1};
|
|||||||
//static const int mc_colors[5]={0x0,0x8,0xa,0xf,0x7};
|
//static const int mc_colors[5]={0x0,0x8,0xa,0xf,0x7};
|
||||||
//static const int mc_colors[5]={0x0,0x9,0x8,0xa,0x3};
|
//static const int mc_colors[5]={0x0,0x9,0x8,0xa,0x3};
|
||||||
|
|
||||||
static void to_meta_with_crop(AVCodecContext *avctx, AVFrame *p, int *dest)
|
static void to_meta_with_crop(AVCodecContext *avctx, const AVFrame *p, int *dest)
|
||||||
{
|
{
|
||||||
int blockx, blocky, x, y;
|
int blockx, blocky, x, y;
|
||||||
int luma = 0;
|
int luma = 0;
|
||||||
@ -190,7 +190,6 @@ static void render_charset(AVCodecContext *avctx, uint8_t *charset,
|
|||||||
static av_cold int a64multi_close_encoder(AVCodecContext *avctx)
|
static av_cold int a64multi_close_encoder(AVCodecContext *avctx)
|
||||||
{
|
{
|
||||||
A64Context *c = avctx->priv_data;
|
A64Context *c = avctx->priv_data;
|
||||||
av_frame_free(&avctx->coded_frame);
|
|
||||||
av_freep(&c->mc_meta_charset);
|
av_freep(&c->mc_meta_charset);
|
||||||
av_freep(&c->mc_best_cb);
|
av_freep(&c->mc_best_cb);
|
||||||
av_freep(&c->mc_charset);
|
av_freep(&c->mc_charset);
|
||||||
@ -242,14 +241,6 @@ static av_cold int a64multi_encode_init(AVCodecContext *avctx)
|
|||||||
AV_WB32(avctx->extradata, c->mc_lifetime);
|
AV_WB32(avctx->extradata, c->mc_lifetime);
|
||||||
AV_WB32(avctx->extradata + 16, INTERLACED);
|
AV_WB32(avctx->extradata + 16, INTERLACED);
|
||||||
|
|
||||||
avctx->coded_frame = av_frame_alloc();
|
|
||||||
if (!avctx->coded_frame) {
|
|
||||||
a64multi_close_encoder(avctx);
|
|
||||||
return AVERROR(ENOMEM);
|
|
||||||
}
|
|
||||||
|
|
||||||
avctx->coded_frame->pict_type = AV_PICTURE_TYPE_I;
|
|
||||||
avctx->coded_frame->key_frame = 1;
|
|
||||||
if (!avctx->codec_tag)
|
if (!avctx->codec_tag)
|
||||||
avctx->codec_tag = AV_RL32("a64m");
|
avctx->codec_tag = AV_RL32("a64m");
|
||||||
|
|
||||||
@ -274,10 +265,9 @@ static void a64_compress_colram(unsigned char *buf, int *charmap, uint8_t *colra
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int a64multi_encode_frame(AVCodecContext *avctx, AVPacket *pkt,
|
static int a64multi_encode_frame(AVCodecContext *avctx, AVPacket *pkt,
|
||||||
const AVFrame *pict, int *got_packet)
|
const AVFrame *p, int *got_packet)
|
||||||
{
|
{
|
||||||
A64Context *c = avctx->priv_data;
|
A64Context *c = avctx->priv_data;
|
||||||
AVFrame *const p = avctx->coded_frame;
|
|
||||||
|
|
||||||
int frame;
|
int frame;
|
||||||
int x, y;
|
int x, y;
|
||||||
@ -308,7 +298,7 @@ static int a64multi_encode_frame(AVCodecContext *avctx, AVPacket *pkt,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* no data, means end encoding asap */
|
/* no data, means end encoding asap */
|
||||||
if (!pict) {
|
if (!p) {
|
||||||
/* all done, end encoding */
|
/* all done, end encoding */
|
||||||
if (!c->mc_lifetime) return 0;
|
if (!c->mc_lifetime) return 0;
|
||||||
/* no more frames in queue, prepare to flush remaining frames */
|
/* no more frames in queue, prepare to flush remaining frames */
|
||||||
@ -321,15 +311,10 @@ static int a64multi_encode_frame(AVCodecContext *avctx, AVPacket *pkt,
|
|||||||
} else {
|
} else {
|
||||||
/* fill up mc_meta_charset with data until lifetime exceeds */
|
/* fill up mc_meta_charset with data until lifetime exceeds */
|
||||||
if (c->mc_frame_counter < c->mc_lifetime) {
|
if (c->mc_frame_counter < c->mc_lifetime) {
|
||||||
ret = av_frame_ref(p, pict);
|
|
||||||
if (ret < 0)
|
|
||||||
return ret;
|
|
||||||
p->pict_type = AV_PICTURE_TYPE_I;
|
|
||||||
p->key_frame = 1;
|
|
||||||
to_meta_with_crop(avctx, p, meta + 32000 * c->mc_frame_counter);
|
to_meta_with_crop(avctx, p, meta + 32000 * c->mc_frame_counter);
|
||||||
c->mc_frame_counter++;
|
c->mc_frame_counter++;
|
||||||
if (c->next_pts == AV_NOPTS_VALUE)
|
if (c->next_pts == AV_NOPTS_VALUE)
|
||||||
c->next_pts = pict->pts;
|
c->next_pts = p->pts;
|
||||||
/* lifetime is not reached so wait for next frame first */
|
/* lifetime is not reached so wait for next frame first */
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user