@@ -144,8 +144,9 @@ cudaVideoCodec validateCodecSupport(AVCodecID codecId) {
144144 return cudaVideoCodec_H264;
145145 case AV_CODEC_ID_HEVC:
146146 return cudaVideoCodec_HEVC;
147+ case AV_CODEC_ID_AV1:
148+ return cudaVideoCodec_AV1;
147149 // TODONVDEC P0: support more codecs
148- // case AV_CODEC_ID_AV1: return cudaVideoCodec_AV1;
149150 // case AV_CODEC_ID_MPEG4: return cudaVideoCodec_MPEG4;
150151 // case AV_CODEC_ID_VP8: return cudaVideoCodec_VP8;
151152 // case AV_CODEC_ID_VP9: return cudaVideoCodec_VP9;
@@ -268,6 +269,7 @@ void BetaCudaDeviceInterface::initializeInterface(
268269
269270 TORCH_CHECK (avStream != nullptr , " AVStream cannot be null" );
270271 timeBase_ = avStream->time_base ;
272+ frameRateAvgFromFFmpeg_ = avStream->r_frame_rate ;
271273
272274 const AVCodecParameters* codecPar = avStream->codecpar ;
273275 TORCH_CHECK (codecPar != nullptr , " CodecParameters cannot be null" );
@@ -484,14 +486,19 @@ UniqueAVFrame BetaCudaDeviceInterface::convertCudaFrameToAVFrame(
484486 avFrame->format = AV_PIX_FMT_CUDA;
485487 avFrame->pts = dispInfo.timestamp ;
486488
487- // TODONVDEC P0: Zero division error!!!
488- // TODONVDEC P0: Move AVRational arithmetic to FFMPEGCommon, and put the
489- // similar SingleStreamDecoder stuff there too.
490- unsigned int frameRateNum = videoFormat_.frame_rate .numerator ;
491- unsigned int frameRateDen = videoFormat_.frame_rate .denominator ;
492- int64_t duration = static_cast <int64_t >((frameRateDen * timeBase_.den )) /
493- (frameRateNum * timeBase_.num );
494- setDuration (avFrame, duration);
489+ // TODONVDEC P2: We compute the duration based on average frame rate info:
490+ // either from NVCUVID if it's valid, otherwise from FFmpeg as fallback. But
491+ // both of these are based on average frame rate, so if the video has
492+ // variable frame rate, the durations may be off. We should try to see if we
493+ // can set the duration more accurately. Unfortunately it's not given by
494+ // dispInfo. One option would be to set it based on the pts difference between
495+ // consecutive frames, if the next frame is already available.
496+ int frameRateNum = static_cast <int >(videoFormat_.frame_rate .numerator );
497+ int frameRateDen = static_cast <int >(videoFormat_.frame_rate .denominator );
498+ AVRational frameRate = (frameRateNum > 0 && frameRateDen > 0 )
499+ ? AVRational{frameRateNum, frameRateDen}
500+ : frameRateAvgFromFFmpeg_;
501+ setDuration (avFrame, computeSafeDuration (frameRate, timeBase_));
495502
496503 // We need to assign the frame colorspace. This is crucial for proper color
497504 // conversion. NVCUVID stores that in the matrix_coefficients field, but
0 commit comments