所以, 我有这个结构:
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维数组数据[]如何成为2维数组数据[0] [bla bla bla ..]?
是否与uint8_t类型有关?
答案 0 :(得分:0)
数据数组不是8 uint_8的数组,而是uint_8的8个指针的数组。 请注意数据前的asterik。 - 类型为uint8_t * - 即指针指向uint8_t。
uint8_t *data[AV_NUM_DATA_POINTERS];
在C中,数组类似于指针,因此如果你有一个指向uint8_t的指针,你可以将它指向的地址和后续地址作为数组访问。
您确实需要正确分配,否则您将遇到分段错误或某些您不期望的数据 - 但这可能是您的库正确处理的。
C也对指针使用特殊算术(指针算术) - 所以指针的类型决定了元素之间的“间距” - 所以如果你有一个指向uint8_t的指针,那么数组元素将被处理,每个元素都是1个字节。以前的。如果类型是uint32_t,那么每个元素将是前一个元素的4个字节 - 以容纳更大的类型。
您可以在此处找到有关C数组和指针算术的更多信息:
C arrays and pointer arithmetic
因为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。
答案 1 :(得分:0)
阅读声明的方法是:
uint8_t *data[AV_NUM_DATA_POINTERS];
^ ^ ^
| | |
| 1. the identifier... |
| |
| 2. ... is an array...
|
3. ...of pointers.
重要的是,数组下标运算符[]
的优先级高于解除引用运算符*
。因此,当编译器看到
data[1][2]
它将执行以下操作:
它会查找符号data
。这有一个数组类型uint8_t *()[]
数组衰减指向第一个元素uint8_t **
的指针
第一个数组下标运算符[1]
通过对衰减指针执行指针运算来访问数组的第一个元素。它等同于*(data + 1)
,结果类型为uint8_t *
第二个数组下标运算符[2]
对从数组*(*(data + 1) + 2)
读取的指针执行相同操作,产生类型为uint8_t
的结果