Merge commit '10a9149de242c7bbc4e130d3d7c593b89e20f80e'
authorMichael Niedermayer <michael@niedermayer.cc>
Mon, 20 Jul 2015 20:25:53 +0000 (22:25 +0200)
committerMichael Niedermayer <michael@niedermayer.cc>
Mon, 20 Jul 2015 20:25:53 +0000 (22:25 +0200)
* commit '10a9149de242c7bbc4e130d3d7c593b89e20f80e':
  ffv1enc: Keep coded_frame.key_frame a write-only variable

Conflicts:
libavcodec/ffv1.h
libavcodec/ffv1enc.c

Merged-by: Michael Niedermayer <michael@niedermayer.cc>
1  2 
libavcodec/ffv1.h
libavcodec/ffv1enc.c

@@@ -87,8 -78,9 +87,9 @@@ typedef struct FFV1Context 
      int transparency;
      int flags;
      int picture_number;
 -    const AVFrame *frame;
 -    AVFrame *last_picture;
+     int key_frame;
 +    ThreadFrame picture, last_picture;
 +    struct FFV1Context *fsrc;
  
      AVFrame *cur;
      int plane_count;
@@@ -1121,24 -879,12 +1121,24 @@@ static int encode_slice(AVCodecContext 
      int height       = fs->slice_height;
      int x            = fs->slice_x;
      int y            = fs->slice_y;
 -    const AVFrame *const p = f->frame;
 -    const int ps     = (av_pix_fmt_desc_get(c->pix_fmt)->flags & AV_PIX_FMT_FLAG_PLANAR)
 -                       ? (f->bits_per_raw_sample > 8) + 1
 -                       : 4;
 +    const AVFrame *const p = f->picture.f;
 +    const int ps     = av_pix_fmt_desc_get(c->pix_fmt)->comp[0].step_minus1 + 1;
 +    int ret;
 +    RangeCoder c_bak = fs->c;
 +    const uint8_t *planes[3] = {p->data[0] + ps*x + y*p->linesize[0],
 +                                p->data[1] + ps*x + y*p->linesize[1],
 +                                p->data[2] + ps*x + y*p->linesize[2]};
 +
 +    fs->slice_coding_mode = 0;
 +    if (f->version > 3) {
 +        choose_rct_params(fs, planes, p->linesize, width, height);
 +    } else {
 +        fs->slice_rct_by_coef = 1;
 +        fs->slice_rct_ry_coef = 1;
 +    }
  
-     if (c->coded_frame->key_frame)
 +retry:
+     if (f->key_frame)
          ffv1_clear_slice_state(f, fs);
      if (f->version > 2) {
          encode_slice_header(f, fs);
@@@ -1253,14 -948,9 +1253,14 @@@ static int encode_frame(AVCodecContext 
      ff_init_range_encoder(c, pkt->data, pkt->size);
      ff_build_rac_states(c, 0.05 * (1LL << 32), 256 - 8);
  
 +    av_frame_unref(p);
 +    if ((ret = av_frame_ref(p, pict)) < 0)
 +        return ret;
 +    avctx->coded_frame->pict_type = AV_PICTURE_TYPE_I;
 +
      if (avctx->gop_size == 0 || f->picture_number % avctx->gop_size == 0) {
          put_rac(c, &keystate, 1);
-         avctx->coded_frame->key_frame = 1;
+         f->key_frame = 1;
          f->gob_count++;
          write_header(f);
      } else {
          buf_p += bytes;
      }
  
 -    if ((avctx->flags & CODEC_FLAG_PASS1) && (f->picture_number & 31) == 0) {
 -        int j, k, m;
 -        char *p   = avctx->stats_out;
 -        char *end = p + STATS_OUT_SIZE;
 -
 -        memset(f->rc_stat, 0, sizeof(f->rc_stat));
 -        for (i = 0; i < f->quant_table_count; i++)
 -            memset(f->rc_stat2[i], 0, f->context_count[i] * sizeof(*f->rc_stat2[i]));
 -
 -        for (j = 0; j < f->slice_count; j++) {
 -            FFV1Context *fs = f->slice_context[j];
 -            for (i = 0; i < 256; i++) {
 -                f->rc_stat[i][0] += fs->rc_stat[i][0];
 -                f->rc_stat[i][1] += fs->rc_stat[i][1];
 -            }
 -            for (i = 0; i < f->quant_table_count; i++) {
 -                for (k = 0; k < f->context_count[i]; k++)
 -                    for (m = 0; m < 32; m++) {
 -                        f->rc_stat2[i][k][m][0] += fs->rc_stat2[i][k][m][0];
 -                        f->rc_stat2[i][k][m][1] += fs->rc_stat2[i][k][m][1];
 -                    }
 -            }
 -        }
 -
 -        for (j = 0; j < 256; j++) {
 -            snprintf(p, end - p, "%" PRIu64 " %" PRIu64 " ",
 -                     f->rc_stat[j][0], f->rc_stat[j][1]);
 -            p += strlen(p);
 -        }
 -        snprintf(p, end - p, "\n");
 -
 -        for (i = 0; i < f->quant_table_count; i++) {
 -            for (j = 0; j < f->context_count[i]; j++)
 -                for (m = 0; m < 32; m++) {
 -                    snprintf(p, end - p, "%" PRIu64 " %" PRIu64 " ",
 -                             f->rc_stat2[i][j][m][0], f->rc_stat2[i][j][m][1]);
 -                    p += strlen(p);
 -                }
 -        }
 -        snprintf(p, end - p, "%d\n", f->gob_count);
 -    } else if (avctx->flags & CODEC_FLAG_PASS1)
 +    if (avctx->flags & CODEC_FLAG_PASS1)
          avctx->stats_out[0] = '\0';
  
+     avctx->coded_frame->key_frame = f->key_frame;
      f->picture_number++;
      pkt->size   = buf_p - pkt->data;
-     pkt->flags |= AV_PKT_FLAG_KEY * avctx->coded_frame->key_frame;
 +    pkt->pts    =
 +    pkt->dts    = pict->pts;
+     pkt->flags |= AV_PKT_FLAG_KEY * f->key_frame;
      *got_packet = 1;
  
      return 0;