Кодирование/декодирование видео - 16 бит серого.
От: Андрей Дмитриев Германия  
Дата: 22.08.09 10:58
Оценка:
Коллеги,

Есть вот такая задачка: нужно создать видеофайл из серии серых 16 битных картинок.
Технически всё что у меня есть — это callback функция, где я получаю указатель на область памяти с картинкой. Функция вызывается тридцать раз в секунду. Картинка размером 1024x1024 точки, 16 бит. Ну то есть 60 MB в секунду видеопоток. Его-то и надо скидывать в видеофайл. При этом должно происходить сжатие (с потерей качества), степень сжатия должна регулироваться. Формат контейнера не очень важен, плейер всё равно будет проприетарный. Способ сжатия типа MPEG4 мне бы подошёл. Кодирование/декодирование должно осуществляться в реальном времени на доступном по мощности компе.

Из рассмотренных навскидку возможностей решения задачки:
— тупо жать картинки по одной JPEG2000. Пока не удаётся достичь приемлемой скорости. Уходит 60-80 мс на картинку, а надо 20-30.

— взять исходники xvid и расковырять — убрать цветовую компоненту, оставить только яркостную и добить её до 16 бит (сейчас там вроде 12 бит). Там всё довольно круто накручено, в исходники лезть как-то не хочется. 8 бит кодирование в xvid меня устраивает и по скорости и по качеству.

— воспользоваться интеловской IPP. Там все видео функции тоже на цвет завязаны. В первом приближении 16 ти битных функция я не увидел, да и сложно там как-то.

— воспользоваться коммерческим кодеком типа LEAD LGRY. Заставить его работать пока не удалось. Объяснения инженера LEAD были очень запутанные (соедините входной пин кодека с выходным пином источника... а меня всего-то только указатель есть).

— есть ещё вроде dirac кодек — пока не пробовал.

Может кто-нибудь уже решал подобную задачку? В каком направлении лучше всего двигаться?

Спасибо заранее,
Андрей.
Re: Кодирование/декодирование видео - 16 бит серого.
От: metaller  
Дата: 26.08.09 16:35
Оценка:
Здравствуйте, Андрей Дмитриев, Вы писали:

АД>- воспользоваться коммерческим кодеком типа LEAD LGRY. Заставить его работать пока не удалось. Объяснения инженера LEAD были очень запутанные (соедините входной пин кодека с выходным пином источника... а меня всего-то только указатель есть).

Нужно всего лишь обернуть свой callback в DirectShow source-фильтр.
Re[2]: Кодирование/декодирование видео - 16 бит серого.
От: Андрей Дмитриев Германия  
Дата: 27.08.09 06:06
Оценка:
M>Нужно всего лишь обернуть свой callback в DirectShow source-фильтр.

Спасибо, я в общем-то тоже склоняюсь к этому решению. По крайней мере не придётся лезть в алгоритмы.

А ткните меня носом пожалуйста в простой примерчик.
Единственные более-менее несложные примерчики, которые я нашёл, вот эти:
http://www.codeproject.com/KB/audio-video/VideoImageGrabber.aspx
http://www.codeproject.com/KB/directx/Paint_your_source_filter.aspx
Я в правильном направлении копаю?

В примерах DirectShow SDK как-то туманно всё...

Где-то в коде мне надо будет вставить вот такую штуку:
---
The following example describes how to set the various fields to describe grayscale 16-bit data in which only the lower 10 bits are to be used:

LGRYVIDEOINFO info; /* warning: do not put this on stack, as it is very large */
info.bmiHeader.biSize = sizeof(LGRYINFOHEADER);
info.bmiHeader.biWidth = VideoWidth;
info.bmiHeader.biHeight = VideoHeight; /* should be positive for normal (unflipped video) */
info.bmiHeader.biPlanes = 1;
info.bmiHeader.biBitCount = 16; /* I have 16 bits per pixel, although only the lower 10 bits contain useful data */
info.bmiHeader.biCompression = mmioFOURCC('L','G','R','Y');
info.bmiHeader.biSizeImage = (((VideoWidth * 2) + 3) & ~3) * VideoHeight;
info.bmiHeader.biClrUsed = 0; /* there is no LUT */
info.bmiHeader.biClrImportant = 0; /* not used right now. Set this value to 0 */
/* Fields specific only to the LGRY format */
info.bmiHeader.biLowBit = 0; /* low bit for the pixel data (0 <= biLowBit <= biHighBit <= biBitCount-1) */
info.bmiHeader.biHighBit = 9; /* 10-1 = 9. high bit for pixel data. */
info.bmiHeader.biFlags = LGRY_BITRANGE_VALID; /* only biLowBit and biHighBit are valid */
---

Андрей.
Re[3]: Кодирование/декодирование видео - 16 бит серого.
От: metaller  
Дата: 27.08.09 16:54
Оценка:
Здравствуйте, Андрей Дмитриев, Вы писали:

АД>А ткните меня носом пожалуйста в простой примерчик.

АД>Единственные более-менее несложные примерчики, которые я нашёл, вот эти:
АД>http://www.codeproject.com/KB/audio-video/VideoImageGrabber.aspx
АД>http://www.codeproject.com/KB/directx/Paint_your_source_filter.aspx
АД>Я в правильном направлении копаю?
Первая ссылка — это renderer, т.е. не совсем в тему, а вторая вроде бы то что надо.

АД>В примерах DirectShow SDK как-то туманно всё...

В примерах из SDK есть достаточно простой source-фильтр Ball, его стоит посмотреть.
Ну и MSDN курить, если что-то не ясно, там все описано подробно.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.