iPad Pro OS v14.3 でフレームをデコードしようとすると、ここで説明したのと同じ問題に直面しています ( Olivia Stork の例も使用しています)。
画像データの 25% が正しくデコードされ、残りの画像は緑色です。
iPad Pro OS v14.3 でデコードされた画像は次のようになります(画像はここで説明されているようにデコーダー コールバックで変換されて保存されているため、表示だけの問題ではありません)。
元画像はこんな感じ。
画像は Windows10 の NVIDIA NVENC (Media Foundation) でエンコードされています。
リンクで説明されているように、追加の 4 バイト NALU 開始コードのフレーム画像データを検索しましたが、SPS、PPS、および IDR 画像データに期待されるものは 3 つしかありません。
まったく同じソースからのフレームを正しくデコードできる別の Media Foundation デコーダー アプリケーションを Windows10 で実行しています。
私は問題の原因を見つけるのに何日も苦労しています..誰かアイデアはありますか?
前もって感謝します。ロブ
- 編集 2021-01-11 :
NALU タイプ 5 の IDR 画像データ ブロック内に、実際には 3 バイトの開始コード (0x000001) が 3 つ追加されていることがわかりました。
ここで説明されているように、これらの開始コードを次のデータ ブロック (ビッグ エンディアン) の長さに置き換えようとしましたが、結果は同じでした。
ここで説明されているように、エミュレーション防止バイト (0x000001 => 0x000301) も追加しようとしましたが、それでも違いはありませんでした。
誤解を招く可能性がありますが、これらの開始コードは問題とは何の関係もありません。少なくとも、画像データ ブロック内の同じ位置 (インデックス) に常に表示されるため、ランダムな画像データではありません。現在、私はアイデアを使い果たしています..何かヒントはありますか?
- 編集 2021-01-14 :
私はさらにいくつかのことを理解しました:
まったくのアイデアの欠如から、ブロックの先頭にある最後の開始コードの後に続く画像データをコピーしました (4 バイトの NALU 開始コードの直後)。元の画像の最後の 4 分の 1 がデコードされた画像の上部に表示されることを期待していましたが、驚いたことに、デコードされた画像は次のようになりました。
2 番目と 3 番目のスタート コードの後に来る画像データで同じことを試したところ、デコードされた画像は次のようになりました。画像データは正しくデコードされ、正しい位置にあります (元の画像と比較してください)。
3 バイトのスタート コードをすべて取り除いて、4 バイトのスタート コードの後に連結された画像データをコピーしても、結果は同じで、画像の 25% しかデコードされません。したがって、追加の 3 バイトの開始コードは明らかに問題ではありません。デコーダーに画像の 25% のみをデコードするように指示する設定がどこかにあるはずです。CMVideoFormatDescription にヒントを与えますが、私が見る限り、問題ないようです。
また、デコーダーがさまざまな画像データブロックを表示する場所をどのように知っているのかも疑問に思っています。画像データ内のどこかにオフセットが定義されているか、すべてのピクセルの xy 位置が何らかの方法でエンコーダーによって追加されます。