@@ -144,8 +144,9 @@ cudaVideoCodec validateCodecSupport(AVCodecID codecId) {
144
144
return cudaVideoCodec_H264;
145
145
case AV_CODEC_ID_HEVC:
146
146
return cudaVideoCodec_HEVC;
147
+ case AV_CODEC_ID_AV1:
148
+ return cudaVideoCodec_AV1;
147
149
// TODONVDEC P0: support more codecs
148
- // case AV_CODEC_ID_AV1: return cudaVideoCodec_AV1;
149
150
// case AV_CODEC_ID_MPEG4: return cudaVideoCodec_MPEG4;
150
151
// case AV_CODEC_ID_VP8: return cudaVideoCodec_VP8;
151
152
// case AV_CODEC_ID_VP9: return cudaVideoCodec_VP9;
@@ -268,6 +269,7 @@ void BetaCudaDeviceInterface::initializeInterface(
268
269
269
270
TORCH_CHECK (avStream != nullptr , " AVStream cannot be null" );
270
271
timeBase_ = avStream->time_base ;
272
+ frameRateAvgFromFFmpeg_ = avStream->r_frame_rate ;
271
273
272
274
const AVCodecParameters* codecPar = avStream->codecpar ;
273
275
TORCH_CHECK (codecPar != nullptr , " CodecParameters cannot be null" );
@@ -484,14 +486,19 @@ UniqueAVFrame BetaCudaDeviceInterface::convertCudaFrameToAVFrame(
484
486
avFrame->format = AV_PIX_FMT_CUDA;
485
487
avFrame->pts = dispInfo.timestamp ;
486
488
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_));
495
502
496
503
// We need to assign the frame colorspace. This is crucial for proper color
497
504
// conversion. NVCUVID stores that in the matrix_coefficients field, but
0 commit comments