|
|
|
@@ -35,7 +35,6 @@ |
|
|
|
*/ |
|
|
|
typedef struct Msvideo1EncContext { |
|
|
|
AVCodecContext *avctx; |
|
|
|
AVFrame pic; |
|
|
|
AVLFG rnd; |
|
|
|
uint8_t *prev; |
|
|
|
|
|
|
|
@@ -67,7 +66,7 @@ static int encode_frame(AVCodecContext *avctx, AVPacket *pkt, |
|
|
|
const AVFrame *pict, int *got_packet) |
|
|
|
{ |
|
|
|
Msvideo1EncContext * const c = avctx->priv_data; |
|
|
|
AVFrame * const p = &c->pic; |
|
|
|
const AVFrame *p = pict; |
|
|
|
uint16_t *src; |
|
|
|
uint8_t *prevptr; |
|
|
|
uint8_t *dst, *buf; |
|
|
|
@@ -75,12 +74,12 @@ static int encode_frame(AVCodecContext *avctx, AVPacket *pkt, |
|
|
|
int no_skips = 1; |
|
|
|
int i, j, k, x, y, ret; |
|
|
|
int skips = 0; |
|
|
|
int quality = 24; |
|
|
|
|
|
|
|
if ((ret = ff_alloc_packet2(avctx, pkt, avctx->width*avctx->height*9 + FF_MIN_BUFFER_SIZE)) < 0) |
|
|
|
return ret; |
|
|
|
dst= buf= pkt->data; |
|
|
|
|
|
|
|
*p = *pict; |
|
|
|
if(!c->prev) |
|
|
|
c->prev = av_malloc(avctx->width * 3 * (avctx->height + 3)); |
|
|
|
prevptr = c->prev + avctx->width * 3 * (FFALIGN(avctx->height, 4) - 1); |
|
|
|
@@ -88,7 +87,6 @@ static int encode_frame(AVCodecContext *avctx, AVPacket *pkt, |
|
|
|
if(c->keyint >= avctx->keyint_min) |
|
|
|
keyframe = 1; |
|
|
|
|
|
|
|
p->quality = 24; |
|
|
|
|
|
|
|
for(y = 0; y < avctx->height; y += 4){ |
|
|
|
for(x = 0; x < avctx->width; x += 4){ |
|
|
|
@@ -114,7 +112,7 @@ static int encode_frame(AVCodecContext *avctx, AVPacket *pkt, |
|
|
|
bestscore += t*t; |
|
|
|
} |
|
|
|
} |
|
|
|
bestscore /= p->quality; |
|
|
|
bestscore /= quality; |
|
|
|
} |
|
|
|
// try to find optimal value to fill whole 4x4 block |
|
|
|
score = 0; |
|
|
|
@@ -130,7 +128,7 @@ static int encode_frame(AVCodecContext *avctx, AVPacket *pkt, |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
score /= p->quality; |
|
|
|
score /= quality; |
|
|
|
score += 2; |
|
|
|
if(score < bestscore){ |
|
|
|
bestscore = score; |
|
|
|
@@ -155,7 +153,7 @@ static int encode_frame(AVCodecContext *avctx, AVPacket *pkt, |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
score /= p->quality; |
|
|
|
score /= quality; |
|
|
|
score += 6; |
|
|
|
if(score < bestscore){ |
|
|
|
bestscore = score; |
|
|
|
@@ -182,7 +180,7 @@ static int encode_frame(AVCodecContext *avctx, AVPacket *pkt, |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
score /= p->quality; |
|
|
|
score /= quality; |
|
|
|
score += 18; |
|
|
|
if(score < bestscore){ |
|
|
|
bestscore = score; |
|
|
|
@@ -248,8 +246,6 @@ static int encode_frame(AVCodecContext *avctx, AVPacket *pkt, |
|
|
|
c->keyint = 0; |
|
|
|
else |
|
|
|
c->keyint++; |
|
|
|
p->pict_type= keyframe ? AV_PICTURE_TYPE_I : AV_PICTURE_TYPE_P; |
|
|
|
p->key_frame= keyframe; |
|
|
|
if (keyframe) pkt->flags |= AV_PKT_FLAG_KEY; |
|
|
|
pkt->size = dst - buf; |
|
|
|
*got_packet = 1; |
|
|
|
@@ -274,8 +270,6 @@ static av_cold int encode_init(AVCodecContext *avctx) |
|
|
|
return -1; |
|
|
|
} |
|
|
|
|
|
|
|
avcodec_get_frame_defaults(&c->pic); |
|
|
|
avctx->coded_frame = (AVFrame*)&c->pic; |
|
|
|
avctx->bits_per_coded_sample = 16; |
|
|
|
|
|
|
|
c->keyint = avctx->keyint_min; |
|
|
|
|