Merge commit 'd4f1188d1a662fed5347e70016da49e01563e8a8'
authorMichael Niedermayer <michaelni@gmx.at>
Mon, 9 Dec 2013 19:06:39 +0000 (20:06 +0100)
committerMichael Niedermayer <michaelni@gmx.at>
Mon, 9 Dec 2013 19:10:15 +0000 (20:10 +0100)
* commit 'd4f1188d1a662fed5347e70016da49e01563e8a8':
  dv: use AVFrame API properly

Conflicts:
libavcodec/dvdec.c

Merged-by: Michael Niedermayer <michaelni@gmx.at>
1  2 
libavcodec/dv.c
libavcodec/dv.h
libavcodec/dvdec.c
libavcodec/dvenc.c

diff --cc libavcodec/dv.c
@@@ -312,16 -311,8 +312,14 @@@ av_cold int ff_dvvideo_init(AVCodecCont
      /* 248DCT setup */
      s->fdct[1]     = dsp.fdct248;
      s->idct_put[1] = ff_simple_idct248_put;  // FIXME: need to add it to DSP
 -    memcpy(s->dv_zigzag[1], ff_zigzag248_direct, 64);
 +    if (avctx->lowres){
 +        for (i = 0; i < 64; i++){
 +            int j = ff_zigzag248_direct[i];
 +            s->dv_zigzag[1][i] = dsp.idct_permutation[(j & 7) + (j & 8) * 4 + (j & 48) / 2];
 +        }
 +    }else
 +        memcpy(s->dv_zigzag[1], ff_zigzag248_direct, 64);
  
-     avcodec_get_frame_defaults(&s->picture);
-     avctx->coded_frame = &s->picture;
      s->avctx = avctx;
      avctx->chroma_sample_location = AVCHROMA_LOC_TOPLEFT;
  
diff --cc libavcodec/dv.h
Simple merge
@@@ -287,10 -286,10 +287,10 @@@ static int dv_decode_video_segment(AVCo
                    uint8_t *c_ptr1, *ptr1;
                    int x, y;
                    mb->idct_put(pixels, 8, block);
-                   for (y = 0; y < (1 << log2_blocksize); y++, c_ptr += s->picture.linesize[j], pixels += 8) {
+                   for (y = 0; y < (1 << log2_blocksize); y++, c_ptr += s->frame->linesize[j], pixels += 8) {
 -                      ptr1   = pixels + (1 << (log2_blocksize - 1));
 +                      ptr1   = pixels + ((1 << (log2_blocksize))>>1);
-                       c_ptr1 = c_ptr + (s->picture.linesize[j] << log2_blocksize);
+                       c_ptr1 = c_ptr + (s->frame->linesize[j] << log2_blocksize);
 -                      for (x = 0; x < (1 << (log2_blocksize - 1)); x++) {
 +                      for (x = 0; x < (1 << FFMAX(log2_blocksize - 1, 0)); x++) {
                            c_ptr[x]  = pixels[x];
                            c_ptr1[x] = ptr1[x];
                        }
@@@ -337,20 -337,13 +338,20 @@@ static int dvvideo_decode_frame(AVCodec
      if (ret < 0)
          return ret;
  
-     if ((ret = ff_get_buffer(avctx, &s->picture, 0)) < 0)
 -    if (ff_get_buffer(avctx, s->frame, 0) < 0) {
 -        av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
 -        return -1;
 -    }
++    if ((ret = ff_get_buffer(avctx, s->frame, 0)) < 0)
 +        return ret;
-     s->picture.interlaced_frame = 1;
-     s->picture.top_field_first  = 0;
+     s->frame->interlaced_frame = 1;
+     s->frame->top_field_first  = 0;
  
-         s->picture.top_field_first = !(vsc_pack[3] & 0x40);
 +    /* Determine the codec's sample_aspect ratio and field order from the packet */
 +    vsc_pack = buf + 80*5 + 48 + 5;
 +    if ( *vsc_pack == dv_video_control ) {
 +        apt = buf[4] & 0x07;
 +        is16_9 = (vsc_pack[2] & 0x07) == 0x02 || (!apt && (vsc_pack[2] & 0x07) == 0x07);
 +        avctx->sample_aspect_ratio = s->sys->sar[is16_9];
++        s->frame->top_field_first = !(vsc_pack[3] & 0x40);
 +    }
 +
      s->buf = buf;
      avctx->execute(avctx, dv_decode_video_segment, s->sys->work_chunks, NULL,
                     dv_work_pool_size(s->sys), sizeof(DVwork_chunk));
  
      /* return image */
      *got_frame = 1;
-     av_frame_move_ref(data, &s->picture);
  
 -    /* Determine the codec's sample_aspect ratio from the packet */
 -    vsc_pack = buf + 80*5 + 48 + 5;
 -    if ( *vsc_pack == dv_video_control ) {
 -        apt = buf[4] & 0x07;
 -        is16_9 = (vsc_pack && ((vsc_pack[2] & 0x07) == 0x02 || (!apt && (vsc_pack[2] & 0x07) == 0x07)));
 -        avctx->sample_aspect_ratio = s->sys->sar[is16_9];
 -    }
 -
      return s->sys->frame_size;
  }
  
@@@ -380,8 -371,6 +371,7 @@@ AVCodec ff_dvvideo_decoder = 
      .id             = AV_CODEC_ID_DVVIDEO,
      .priv_data_size = sizeof(DVVideoContext),
      .init           = ff_dvvideo_init,
-     .close          = dvvideo_close,
      .decode         = dvvideo_decode_frame,
      .capabilities   = CODEC_CAP_DR1 | CODEC_CAP_SLICE_THREADS,
 +    .max_lowres     = 3,
  };
@@@ -42,11 -42,11 +42,15 @@@ static av_cold int dvvideo_init_encoder
          ff_dv_print_profiles(avctx, AV_LOG_ERROR);
          return AVERROR(EINVAL);
      }
 +    if (avctx->height > 576) {
 +        av_log(avctx, AV_LOG_ERROR, "DVCPRO HD encoding is not supported.\n");
 +        return AVERROR_PATCHWELCOME;
 +    }
  
+     avctx->coded_frame = av_frame_alloc();
+     if (!avctx->coded_frame)
+         return AVERROR(ENOMEM);
      dv_vlc_map_tableinit();
  
      return ff_dvvideo_init(avctx);
@@@ -519,7 -519,6 +523,7 @@@ static inline int dv_write_pack(enum dv
       *      compression scheme (if any).
       */
      int apt   = (c->sys->pix_fmt == AV_PIX_FMT_YUV420P ? 0 : 1);
-     int fs    = c->picture.top_field_first ? 0x00 : 0x40;
++    int fs    = c->frame->top_field_first ? 0x00 : 0x40;
  
      uint8_t aspect = 0;
      if ((int)(av_q2d(c->avctx->sample_aspect_ratio) * c->avctx->width / c->avctx->height * 10) >= 17) /* 16:9 */
@@@ -664,13 -663,15 +668,13 @@@ static int dvvideo_encode_frame(AVCodec
      s->sys = avpriv_dv_codec_profile(c);
      if (!s->sys || ff_dv_init_dynamic_tables(s->sys))
          return -1;
 -    if ((ret = ff_alloc_packet(pkt, s->sys->frame_size)) < 0) {
 -        av_log(c, AV_LOG_ERROR, "Error getting output packet.\n");
 +    if ((ret = ff_alloc_packet2(c, pkt, s->sys->frame_size)) < 0)
          return ret;
 -    }
  
-     c->pix_fmt           = s->sys->pix_fmt;
-     s->picture           = *frame;
-     s->picture.key_frame = 1;
-     s->picture.pict_type = AV_PICTURE_TYPE_I;
+     c->pix_fmt                = s->sys->pix_fmt;
+     s->frame                  = frame;
+     c->coded_frame->key_frame = 1;
+     c->coded_frame->pict_type = AV_PICTURE_TYPE_I;
  
      s->buf = pkt->data;
      c->execute(c, dv_encode_video_segment, s->sys->work_chunks, NULL,