Timestamps are unset in a packet for stream 0. This is deprecated and will stop working in the futur

Timestamps are unset in a packet for stream 0. This is deprecated and will stop working in the future. Fix your code

/* check that the timestamps are set */

if (pkt->pts == AV_NOPTS_VALUE || pkt->dts == AV_NOPTS_VALUE) {

av_log(s, AV_LOG_ERROR,"Timestamps are unset in a packet for stream %d\n", st->index);

return AVERROR(EINVAL);

}

//FIXME merge with compute_pkt_fields
556  static int compute_muxer_pkt_fields( AVFormatContext *s, AVStream *st, AVPacket * pkt)
557 {
558  int delay = FFMAX(st-> codecpar-> video_delay, st-> internal-> avctx-> max_b_frames > 0);
559  int num, den, i;
560  int frame_size;
561 
562  if (!s-> internal->missing_ts_warning &&
563  !(s-> oformat-> flags & AVFMT_NOTIMESTAMPS) &&
565  (pkt-> pts == AV_NOPTS_VALUE || pkt-> dts == AV_NOPTS_VALUE)) {
567  "Timestamps are unset in a packet for stream %d. "
568  "This is deprecated and will stop working in the future. "
569  "Fix your code to set the timestamps properly\n", st-> index);
570  s-> internal->missing_ts_warning = 1;
571  }
572 
573  if (s-> debug & FF_FDEBUG_TS)
574  av_log(s, AV_LOG_TRACE, "compute_muxer_pkt_fields: pts:%s dts:%s cur_dts:%s b:%d size:%d st:%d\n",
575  av_ts2str(pkt-> pts), av_ts2str(pkt-> dts), av_ts2str(st-> cur_dts), delay, pkt-> size, pkt-> stream_index);
576 
577  if (pkt-> duration < 0 && st-> codecpar-> codec_type != AVMEDIA_TYPE_SUBTITLE) {
578  av_log(s, AV_LOG_WARNING, "Packet with invalid duration %"PRId64 " in stream %d\n",
579  pkt-> duration, pkt-> stream_index);
580  pkt-> duration = 0;
581  }
582 
583  /* duration field */
584  if (pkt-> duration == 0) {
585  ff_compute_frame_duration(s, &num, &den, st, NULL, pkt);
586  if (den && num) {
587  pkt-> duration = av_rescale(1, num * (int64_t)st-> time_base. den * st->codec->ticks_per_frame, den * (int64_t)st-> time_base. num);
588  }
589  }
590 
591  if (pkt-> pts == AV_NOPTS_VALUE && pkt-> dts != AV_NOPTS_VALUE && delay == 0)
592  pkt-> pts = pkt-> dts;
593 
594  //XXX/FIXME this is a temporary hack until all encoders output pts
595  if ((pkt-> pts == 0 || pkt-> pts == AV_NOPTS_VALUE) && pkt-> dts == AV_NOPTS_VALUE && !delay) {
596  static int warned;
597  if (!warned) {
598  av_log(s, AV_LOG_WARNING, "Encoder did not produce proper pts, making some up.\n");
599  warned = 1;
600  }
601  pkt-> dts =
602  // pkt->pts= st->cur_dts;
603  pkt-> pts = st-> internal-> priv_pts-> val;
604  }
605 
606  //calculate dts from pts
607  if (pkt-> pts != AV_NOPTS_VALUE && pkt-> dts == AV_NOPTS_VALUE && delay <= MAX_REORDER_DELAY) {
608  st-> pts_buffer[0] = pkt-> pts;
609  for (i = 1; i < delay + 1 && st-> pts_buffer[i] == AV_NOPTS_VALUE; i++)
610  st-> pts_buffer[i] = pkt-> pts + (i - delay - 1) * pkt-> duration;
611  for (i = 0; i<delay && st-> pts_buffer[i] > st-> pts_buffer[i + 1]; i++)
612  FFSWAP(int64_t, st-> pts_buffer[i], st-> pts_buffer[i + 1]);
613 
614  pkt-> dts = st-> pts_buffer[0];
615  }
616 
617  if (st-> cur_dts && st-> cur_dts != AV_NOPTS_VALUE &&
618  ((!(s-> oformat-> flags & AVFMT_TS_NONSTRICT) &&
621  st-> cur_dts >= pkt-> dts) || st-> cur_dts > pkt-> dts)) {
622  av_log(s, AV_LOG_ERROR,
623  "Application provided invalid, non monotonically increasing dts to muxer in stream %d: %s >= %s\n",
624  st-> index, av_ts2str(st-> cur_dts), av_ts2str(pkt-> dts));
625  return AVERROR(EINVAL);
626  }
627  if (pkt-> dts != AV_NOPTS_VALUE && pkt-> pts != AV_NOPTS_VALUE && pkt-> pts < pkt-> dts) {
628  av_log(s, AV_LOG_ERROR,
629  "pts (%s) < dts (%s) in stream %d\n",
630  av_ts2str(pkt-> pts), av_ts2str(pkt-> dts),
631  st-> index);
632  return AVERROR(EINVAL);
633  }
634 
635  if (s-> debug & FF_FDEBUG_TS)
636  av_log(s, AV_LOG_TRACE, "av_write_frame: pts2:%s dts2:%s\n",
637  av_ts2str(pkt-> pts), av_ts2str(pkt-> dts));
638 
639  st-> cur_dts = pkt-> dts;
640  st-> internal-> priv_pts-> val = pkt-> dts;
641 
642  /* update pts */
643  switch (st-> codecpar-> codec_type) {
644  case AVMEDIA_TYPE_AUDIO:
645  frame_size = (pkt-> flags & AV_PKT_FLAG_UNCODED_FRAME) ?
646  (( AVFrame *)pkt-> data)->nb_samples :
647  av_get_audio_frame_duration(st->codec, pkt-> size);
648 
649  /* HACK/FIXME, we skip the initial 0 size packets as they are most
650  * likely equal to the encoder delay, but it would be better if we
651  * had the real timestamps from the encoder */
652  if (frame_size >= 0 && (pkt-> size || st-> internal-> priv_pts-> num != st-> internal-> priv_pts-> den >> 1 || st-> internal-> priv_pts-> val)) {
653  frac_add(st-> internal-> priv_pts, (int64_t)st-> time_base. den * frame_size);
654  }
655  break;
656  case AVMEDIA_TYPE_VIDEO:
657  frac_add(st-> internal-> priv_pts, (int64_t)st-> time_base. den * st-> time_base. num);
658  break;
659  }
660  return 0;
661 }

猜你喜欢

转载自blog.csdn.net/jacke121/article/details/80456243