0

わかりました、私は大学のコースで C についてほとんど知らないので、私の質問を理解していただければ幸いです。Android用のFFmpegライブラリを使用しているので、Cコードの何かを理解する必要があります。

だから、私はこの構造体を持っています:

typedef struct AVFrame {
#define AV_NUM_DATA_POINTERS 8
    /**
     * pointer to the picture/channel planes.

     */
    uint8_t *data[AV_NUM_DATA_POINTERS];

  .......(some more types)
}

それだけですが、他のファイルの関数を見ると、次の行が表示されて混乱します。

関数の外:

static AVFrame  *picture_hq;

そして関数内:

picture_hq->data[0][y * picture_hq->linesize[0] + x] = native_video_frame_data[0];

不明な引数に注意を払わないでください。上記の構造体の 1 次元配列 data[] が 2 次元配列 data[0][bla bla bla..] になる方法がわかりません。

それは uint8_t タイプに関連していますか?

4

2 に答える 2

0

データ配列は 8 つの uint_8 の配列ではなく、uint_8 への 8 つのポインターの配列です。データの前のアスタリスクに注意してください。- タイプは uint8_t* です - これは uint8_t へのポインターです。

uint8_t *data[AV_NUM_DATA_POINTERS];

C では、配列はポインターに似ているため、uint8_t へのポインターがあれば、それが指すアドレスとそれに続くアドレスに配列としてアクセスできます。

これを適切に割り当てる必要があります。そうしないと、セグメンテーション違反が発生するか、予期しないデータが発生しますが、これはおそらくライブラリによって適切に処理されます。

C では、ポインターに特別な演算 (ポインター演算) も使用します。つまり、ポインターの型によって要素間の「間隔」が決まります。したがって、uint8_t へのポインターがある場合、配列要素は、各要素が前の要素から 1 バイトで処理されます。型が uint32_t の場合、各要素は前の要素から 4 バイトになり、より大きな型に対応します。

C 配列とポインター演算の詳細については、次を参照してください。

C 配列とポインター演算

したがって、data[] は uint8_t へのポインターの配列であるため、data[0] は uint8_t へのポインターです。このポインタを uint8_t の配列の先頭として扱うことができるので、

picture_hq->data[0][y * picture_hq->linesize[0] + x] = native_video_frame_data[0];

data[0] が指すアドレスから (y * picture_hq->linesize[0] + x) オフセットにアクセスし、それを uint8_t として扱います。

于 2013-10-22T06:46:28.510 に答える
0

宣言の読み方は次のとおりです。

uint8_t *data[AV_NUM_DATA_POINTERS];
        ^   ^                    ^
        |   |                    |
        |  1. the identifier...  |
        |                        |
        |           2. ... is an array...
        |
  3. ...of pointers.

これに関する重要な点は、配列添字演算子[]が逆参照演算子よりも優先順位が高いということです*。その結果、コンパイラが見たとき

data[1][2]

次のことを行います。

  1. シンボルを検索しますdata。これには配列型がありますuint8_t *()[]

  2. 配列は最初の要素へのポインターに減衰しますuint8_t **

  3. 最初の配列添え字演算子[1]は、減衰したポインターでポインター演算を実行することにより、配列の最初の要素にアクセスします。と同等です*(data + 1)。結果は次のタイプですuint8_t *

  4. 2 番目の配列添字演算子[2]は、配列から読み取ったポインターに対して同じことを行い、次*(*(data + 1) + 2)の型の結果を生成します。uint8_t

于 2013-10-22T08:14:21.870 に答える