動画中の指定フレームへ移動する際、直前のIDRフレームから復号を再開し、不要な中間フレームと後処理を省けるようになった。NVIDIA Video Codec SDK 13.1が、フレーム単位のシークAPIを追加した。
指定フレームを取り出すためのシークAPI
NVIDIAの動画処理ソフトウェア開発キット「Video Codec SDK 13.1」は、NvVideoDecoderクラスにフレーム単位のシークとランダムアクセスを追加した。アプリケーションは取り出したいフレームを指定し、配列の添字で要素を選ぶような形でアクセスできる。
物体検出や動画要約の処理、学習データの準備、動画編集では、動画全体を順に見るよりも特定のフレームを取り出す場面がある。このAPIは、指定位置へ到達するまでの復号経路を組み立てる。
直前のIDRフレームから復号を再開
フレームNが指定されると、SDKはその直前のIDRフレームを探し、動画のデータを分離するデマルチプレクサーをその位置へ移す。IDRフレームは、ほかのフレームを参照せずに復号を始められる位置になる。
移動後はCUVID_PKT_DISCONTINUITYを使ってデコーダーの状態をクリアする。これにより、移動前の復号状態を持ち越さず、見つけたIDRフレームから指定フレームへ向かう処理に入る。
参照しない中間フレームを飛ばす
IDRフレームから指定位置へ進む間、パーサーは参照に使わない中間フレームを判別してスキップする。一方、後続フレームの復号に必要な参照フレームは処理経路に残す。
この選別によって、指定フレームへ到達するために必要なフレームだけが処理される。NVIDIAは、この経路をフレーム単位のランダムアクセスに用いるとしている。
参照フレームは復号し、後処理を省く
途中の参照フレームは、後続フレームの復号に使うため復号される。ただし、アプリケーションへ渡すためのマッピングや形式変換などの後処理は通らない。
指定フレームまでの経路では、参照に不要なフレームを飛ばし、必要な参照フレームも復号後の処理を省く。シークAPIは、この二段階の選別で指定フレームへのアクセスを進める。