Фильтр кадров 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 ответ
Решено путем выделения памяти только один раз за цикл. Нет причин выделять память для каждого кадра, так как мне нужно держать только один кадр за раз.