Commit 56672aea authored by Vittorio Giovara's avatar Vittorio Giovara

svq1enc: Do not entangle coded_frame

parent 05fb4c9a
...@@ -238,14 +238,13 @@ static int svq1_encode_plane(SVQ1EncContext *s, int plane, ...@@ -238,14 +238,13 @@ static int svq1_encode_plane(SVQ1EncContext *s, int plane,
unsigned char *decoded_plane, unsigned char *decoded_plane,
int width, int height, int src_stride, int stride) int width, int height, int src_stride, int stride)
{ {
const AVFrame *f = s->avctx->coded_frame;
int x, y; int x, y;
int i; int i;
int block_width, block_height; int block_width, block_height;
int level; int level;
int threshold[6]; int threshold[6];
uint8_t *src = s->scratchbuf + stride * 16; uint8_t *src = s->scratchbuf + stride * 16;
const int lambda = (f->quality * f->quality) >> const int lambda = (s->quality * s->quality) >>
(2 * FF_LAMBDA_SHIFT); (2 * FF_LAMBDA_SHIFT);
/* figure out the acceptable level thresholds in advance */ /* figure out the acceptable level thresholds in advance */
...@@ -256,7 +255,7 @@ static int svq1_encode_plane(SVQ1EncContext *s, int plane, ...@@ -256,7 +255,7 @@ static int svq1_encode_plane(SVQ1EncContext *s, int plane,
block_width = (width + 15) / 16; block_width = (width + 15) / 16;
block_height = (height + 15) / 16; block_height = (height + 15) / 16;
if (f->pict_type == AV_PICTURE_TYPE_P) { if (s->pict_type == AV_PICTURE_TYPE_P) {
s->m.avctx = s->avctx; s->m.avctx = s->avctx;
s->m.current_picture_ptr = &s->m.current_picture; s->m.current_picture_ptr = &s->m.current_picture;
s->m.last_picture_ptr = &s->m.last_picture; s->m.last_picture_ptr = &s->m.last_picture;
...@@ -272,12 +271,12 @@ static int svq1_encode_plane(SVQ1EncContext *s, int plane, ...@@ -272,12 +271,12 @@ static int svq1_encode_plane(SVQ1EncContext *s, int plane,
s->m.mb_stride = s->m.mb_width + 1; s->m.mb_stride = s->m.mb_width + 1;
s->m.b8_stride = 2 * s->m.mb_width + 1; s->m.b8_stride = 2 * s->m.mb_width + 1;
s->m.f_code = 1; s->m.f_code = 1;
s->m.pict_type = f->pict_type; s->m.pict_type = s->pict_type;
s->m.me_method = s->avctx->me_method; s->m.me_method = s->avctx->me_method;
s->m.me.scene_change_score = 0; s->m.me.scene_change_score = 0;
// s->m.out_format = FMT_H263; // s->m.out_format = FMT_H263;
// s->m.unrestricted_mv = 1; // s->m.unrestricted_mv = 1;
s->m.lambda = f->quality; s->m.lambda = s->quality;
s->m.qscale = s->m.lambda * 139 + s->m.qscale = s->m.lambda * 139 +
FF_LAMBDA_SCALE * 64 >> FF_LAMBDA_SCALE * 64 >>
FF_LAMBDA_SHIFT + 7; FF_LAMBDA_SHIFT + 7;
...@@ -372,13 +371,13 @@ static int svq1_encode_plane(SVQ1EncContext *s, int plane, ...@@ -372,13 +371,13 @@ static int svq1_encode_plane(SVQ1EncContext *s, int plane,
ff_init_block_index(&s->m); ff_init_block_index(&s->m);
ff_update_block_index(&s->m); ff_update_block_index(&s->m);
if (f->pict_type == AV_PICTURE_TYPE_I || if (s->pict_type == AV_PICTURE_TYPE_I ||
(s->m.mb_type[x + y * s->m.mb_stride] & (s->m.mb_type[x + y * s->m.mb_stride] &
CANDIDATE_MB_TYPE_INTRA)) { CANDIDATE_MB_TYPE_INTRA)) {
for (i = 0; i < 6; i++) for (i = 0; i < 6; i++)
init_put_bits(&s->reorder_pb[i], reorder_buffer[0][i], init_put_bits(&s->reorder_pb[i], reorder_buffer[0][i],
7 * 32); 7 * 32);
if (f->pict_type == AV_PICTURE_TYPE_P) { if (s->pict_type == AV_PICTURE_TYPE_P) {
const uint8_t *vlc = ff_svq1_block_type_vlc[SVQ1_BLOCK_INTRA]; const uint8_t *vlc = ff_svq1_block_type_vlc[SVQ1_BLOCK_INTRA];
put_bits(&s->reorder_pb[5], vlc[1], vlc[0]); put_bits(&s->reorder_pb[5], vlc[1], vlc[0]);
score[0] = vlc[1] * lambda; score[0] = vlc[1] * lambda;
...@@ -394,7 +393,7 @@ static int svq1_encode_plane(SVQ1EncContext *s, int plane, ...@@ -394,7 +393,7 @@ static int svq1_encode_plane(SVQ1EncContext *s, int plane,
best = 0; best = 0;
if (f->pict_type == AV_PICTURE_TYPE_P) { if (s->pict_type == AV_PICTURE_TYPE_P) {
const uint8_t *vlc = ff_svq1_block_type_vlc[SVQ1_BLOCK_INTER]; const uint8_t *vlc = ff_svq1_block_type_vlc[SVQ1_BLOCK_INTER];
int mx, my, pred_x, pred_y, dxy; int mx, my, pred_x, pred_y, dxy;
int16_t *motion_ptr; int16_t *motion_ptr;
...@@ -571,7 +570,6 @@ static int svq1_encode_frame(AVCodecContext *avctx, AVPacket *pkt, ...@@ -571,7 +570,6 @@ static int svq1_encode_frame(AVCodecContext *avctx, AVPacket *pkt,
const AVFrame *pict, int *got_packet) const AVFrame *pict, int *got_packet)
{ {
SVQ1EncContext *const s = avctx->priv_data; SVQ1EncContext *const s = avctx->priv_data;
AVFrame *const p = avctx->coded_frame;
int i, ret; int i, ret;
if (!pkt->data && if (!pkt->data &&
...@@ -606,12 +604,16 @@ static int svq1_encode_frame(AVCodecContext *avctx, AVPacket *pkt, ...@@ -606,12 +604,16 @@ static int svq1_encode_frame(AVCodecContext *avctx, AVPacket *pkt,
init_put_bits(&s->pb, pkt->data, pkt->size); init_put_bits(&s->pb, pkt->data, pkt->size);
p->pict_type = avctx->gop_size && avctx->frame_number % avctx->gop_size ? if (avctx->gop_size && (avctx->frame_number % avctx->gop_size))
AV_PICTURE_TYPE_P : AV_PICTURE_TYPE_I; s->pict_type = AV_PICTURE_TYPE_P;
p->key_frame = p->pict_type == AV_PICTURE_TYPE_I; else
p->quality = pict->quality; s->pict_type = AV_PICTURE_TYPE_I;
s->quality = pict->quality;
svq1_write_header(s, p->pict_type); avctx->coded_frame->pict_type = s->pict_type;
avctx->coded_frame->key_frame = s->pict_type == AV_PICTURE_TYPE_I;
svq1_write_header(s, s->pict_type);
for (i = 0; i < 3; i++) for (i = 0; i < 3; i++)
if (svq1_encode_plane(s, i, if (svq1_encode_plane(s, i,
pict->data[i], pict->data[i],
...@@ -637,7 +639,7 @@ static int svq1_encode_frame(AVCodecContext *avctx, AVPacket *pkt, ...@@ -637,7 +639,7 @@ static int svq1_encode_frame(AVCodecContext *avctx, AVPacket *pkt,
flush_put_bits(&s->pb); flush_put_bits(&s->pb);
pkt->size = put_bits_count(&s->pb) / 8; pkt->size = put_bits_count(&s->pb) / 8;
if (p->pict_type == AV_PICTURE_TYPE_I) if (s->pict_type == AV_PICTURE_TYPE_I)
pkt->flags |= AV_PKT_FLAG_KEY; pkt->flags |= AV_PKT_FLAG_KEY;
*got_packet = 1; *got_packet = 1;
......
...@@ -44,6 +44,10 @@ typedef struct SVQ1EncContext { ...@@ -44,6 +44,10 @@ typedef struct SVQ1EncContext {
PutBitContext pb; PutBitContext pb;
GetBitContext gb; GetBitContext gb;
/* Some compression statistics */
enum AVPictureType pict_type;
int quality;
/* why ooh why this sick breadth first order, /* why ooh why this sick breadth first order,
* everything is slower and more complex */ * everything is slower and more complex */
PutBitContext reorder_pb[6]; PutBitContext reorder_pb[6];
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment