Фильтр кадров VirtualDub - освобождение памяти

Я пишу фильтр VirtualDub, который требует отдельного буфера кадров для промежуточной обработки изображений между fa->src.data и fa->dst.data (.data по сути является указателем на данные пикселей).

Я создаю указатель на символ выше, используя это:

/* Pointers to source and destination frame stores */
char *src = (char *)fa->src.data;
char *dst = (char *)fa->dst.data;

/* Image width and height */
int w = fa->src.w*sizeof(Pixel32);
int h = fa->src.h*sizeof(Pixel32);

Затем это позволяет мне копировать данные из исходного кадра в целевой кадр, строка за строкой:

memcpy(dst,src,w);

Теперь я хотел бы иметь промежуточный буфер, который я могу скопировать из * dst в буфер, затем из буфера в * src. Как я могу это сделать?

Я попробовал несколько вещей с разной степенью успеха.

/* Define and initialise char array with malloc */
char *buf = (char*)malloc(w*h); 

Затем:

memcpy(buf,src,w); /* copy to buffer */
memcpy(dst,buf,w); /* copy from buffer to dst */

В большинстве случаев это работает. Однако через некоторое время я получаю "Доступ к памяти за пределами допустимого диапазона (нарушение доступа) произошел в модуле". Проблема в том, что у меня, похоже, заканчивается системная память (VirtualDub забирает ВСЕ доступную память через некоторое время).

Нужно ли освобождать буфер? Кажется странным, так как он инициализируется каждый кадр. Как я могу освободить это?

Я попытался бесплатно (dstbuf) и бесплатно (&dstbuf), но я получаю сообщение об ошибке "Отладка не подтверждена" во время выполнения, выражение: _CrtIsValidHeapPointer(pUserData)... с немного больше.

Есть идеи?

1 ответ

Решено путем выделения памяти только один раз за цикл. Нет причин выделять память для каждого кадра, так как мне нужно держать только один кадр за раз.

Другие вопросы по тегам