Показаны сообщения с ярлыком программирование. Показать все сообщения
Показаны сообщения с ярлыком программирование. Показать все сообщения

пятница, 14 мая 2010 г.

Просто интересно..

.. как это вообще будет выглядеть, если:

The cross-platform support will be provided by having the windows-based compiler generate binaries for Linux and Mac OS X. The compiler and IDE will not be ported to these platforms to ensure a stable working environment.

Это про следующую Delphi (2011, Fulcrum); можно будет под виндой собирать бинарники для линукса и макоси – а отлаживать как? В виртуальной машине?..

Я в шоцi..

понедельник, 22 марта 2010 г.

Вчера был секас!..

:)

Все ж не оставляю желания сделать светодиодно-светящуюся штуку, like “лампа настроения

Сначала приставал по радио-рынку с дурацкими вопросами про RGB-светодиоды (3 одноцветных, максимально стуленных в кучу, не доставляют), обошел все ряды раза 3-4, не обзывали, но думаю думали нехорошее :) В конце-концов все же купил пару выводных 5-мм в прозрачном корпусе и пару smd..

У выводных хорошо видно 3 кристалла отдельных, так что свет тоже не смешивается идеально, но поск. белого цвета мне не надо, то сойдет для тестов; смд еще не включал, тоже прозрачный корпус, но как правило они ж широкоугольные, так что надеюсь на эффект

четверг, 4 июня 2009 г.

Про видео-декодирование..

Просто себе на заметку (типа все, что написал - запомнил): бился с непонятным багом, когда не хотело декодироваться видео в On2TrueMotion из flv файла.. ладно бы был совсем тупой - но в другой моей же программе этот же файл декодировался :)

А всего-то оказалось, что этот (...) декодер не желает декодировать промежуточные кадры просто так, без "предистории" (т.е. без декодирования ключевого кадра).. из "обычного" flv декодируется любой кадр (при этом для не-ключевого кадра картинка будет серая, а кусочки, которые поменялись с предыдущего кадра, собственно будут содержать это изменение), а этот не желает..

Но я его не виню ;) - он же не с AV падал, а честно говорил на своем непонятном языке машинном - "не получилось декодировать"..

Т.е. решение для декодирования произвольного кадра: катится назад, пока не найдется ключевой кадр, и декодировать с него до нужного..

з.ы. западло кажется в том, что я когда-то на это уже наступал и должен был бы сообразить быстрее, в чем дело..

пятница, 29 мая 2009 г.

Thumbnails для флеш-файлов..

До этой темы у меня руки не дойдут все никак уже с год точно :(

Как вот люди есть, которые все успевают и еще время свободное остается?..

По отдельности я все могу - сделать эскиз для swf или flv файла, сделать провайдер эскизов для типа файлов; а слепить все в кучу - как подумаю, что надо что-то сочинять несколькоступенчатое: эскизы мгновенно не делаются, значит надо обрабатывать запрос на эскиз, создавать этот эскиз и хранить в какой-нибудь БД локальной, чтоб к следующему разу оттуда его достать.. а запросы могут из разных потоков приходить, так что прямо читать базу наверное не выход, надо какая-то очередь

Как начнешь все это придумывать - так сразу и накатывает сонливость и апатия и все откладывается "до лучших времен" :) ..

Или просто надоело программировать?.. когда-то "для души" программки по ночам писал, тестил, сапортил.. а теперь - "да нафига оно мне надо?.."

Это видимо старость :)

з.ы. а еще в зачаточном состоянии лежит проект для индексирования fb2-файлов (книжки в электронном виде); учитывая, что у меня их 70000+ штук - вроде и очень нужная вещь.. а лень..

з.з.ы. последнее недорожденное - это тулза для получения инфы для видеофайлов: привык уже к хорошему, когда использую XBMC для просмотра видео (и в основном сериалов) и для каждого сериала/сезона свой фанарт, описания серий, скриншоты и прочие свистелки.. А почему-то что сам xbmc, что программы-помощники так тупят, когда обновляют данные, сил нет - так что начал своего "помощника" писать.. ну что, инфу с tvdb научился брать - дальше сразу резко неинтересно стало..

пятница, 8 мая 2009 г.

Win7 - красивости

Благополучно переехал на Win7 RC - мне нравится еще больше

Одна из фишек, которую захотелось сразу сделать - показ прогресса чего-нибудь прямо на кнопке в таскбаре; вроде получилось, ничего военного в общем нету; код:

uses
  windows;

type
  TBPF = (TBPF_NOPROGRESS = 0,
          TBPF_INDETERMINATE = 1,
          TBPF_NORMAL = 2,
          TBPF_ERROR = 4,
          TBPF_PAUSED = 8);
  TBATF = (TBATF_USEMDITHUMBNAIL = 1,
           TBATF_USEMDILIVEPREVIEW = 2);

function InitTaskBar: HResult;
function SetTaskBarState ( hWnd: HWND; State: TBPF ): HResult;
function SetTaskBarValue ( hWnd: HWND; Value: integer ): HResult;

implementation

uses
  ActiveX;

const
  CLSID_TaskbarList: TGUID = '{56fdf344-fd6d-11d0-958a-006097c9a090}';
  IID_ITaskbarList:  TGUID = '{56FDF342-FD6D-11d0-958A-006097C9A090}';
  IID_ITaskbarList2: TGUID = '{602D4995-B13A-429b-A66E-1935E44F4317}';
  IID_ITaskbarList3: TGUID = '{ea1afb91-9e28-4b86-90e9-9e9f8a5eefaf}';

type
   ITaskbarList = interface(IUnknown)
      ['{56FDF342-FD6D-11d0-958A-006097C9A090}']
      function HrInit : HResult; stdcall;
      function AddTab(hWndOwner : HWND) : HResult; stdcall;
      function DeleteTab(hWndOwner : HWND) : HResult; stdcall;
      function ActivateTab(hWndOwner : HWND) : HResult; stdcall;
      function SetActiveAlt(hWndOwner : HWND) : HResult; stdcall;
   end; { ITaskbarList }

  ITaskbarList2 = interface(ITaskbarList)
    ['{602D4995-B13A-429b-A66E-1935E44F4317}']
    function MarkFullscreenWindow(wnd : HWND; fFullscreen : bool) : HResult; stdcall;
  end;

  ITaskbarList3 = interface (ITaskbarList2)
  ['{ea1afb91-9e28-4b86-90e9-9e9f8a5eefaf}']
    function SetProgressValue (hWnd: HWND; ullCompleted: int64; ullTotal: int64): HResult; stdcall;
    function SetProgressState (hWnd: HWND; tbpFlags: TBPF): HResult; stdcall;
    function RegisterTab (hwndTab: HWND; hwndMDI: HWND): HResult; stdcall;
    function UnregisterTab (hwndTab: HWND): HResult; stdcall;
    function SetTabOrder (hwndTab: HWND; hwndInsertBefore: HWND): HResult; stdcall;
    function SetTabActive (hwndTab: HWND; hwndMDI: HWND; tbatFlags: TBATF): HResult; stdcall;
    function ThumbBarAddButtons (hWnd: HWND; cButtons: integer; pButtons: pointer): HResult; stdcall;
    function ThumbBarUpdateButtons (hWnd: HWND; cButtons: cardinal; pButtons: pointer): HResult; stdcall;
    function ThumbBarSetImageList (hWnd: HWND; himl: pointer): HResult; stdcall;
    function SetOverlayIcon (hWnd: HWND; hIcon: HICON; pszDescription: PWideChar): HResult; stdcall;
    function SetThumbnailTooltip (hWnd: HWND; pszTip: PWideChar): HResult; stdcall;
    function SetThumbnailClip (hWnd: HWND; prcClip: PRect): HResult; stdcall;
  end;

var
  pTaskBarList: ITaskbarList3;

function InitTaskBar: HResult;
begin
  Result := CoCreateInstance (CLSID_TaskbarList, nil, CLSCTX_INPROC_SERVER, IID_ITaskbarList3, pTaskbarList);
  if Failed ( Result ) then
    pTaskBarList := nil;
end;

function SetTaskBarState ( hWnd: HWND; State: TBPF ): HResult;
begin
  if pTaskBarList = nil then
    Result := S_FALSE else
    Result := pTaskBarList.SetProgressState ( hWnd, State );
end;

function SetTaskBarValue ( hWnd: HWND; Value: integer ): HResult;
begin
  // assume Value = 0-100
  if pTaskBarList = nil then
    Result := S_FALSE else
    Result := pTaskBarList.SetProgressValue ( hWnd, Value, 100 );
end;

Использование - проще некуда: код можно выделить в отдельный юнит и подключать его при необходимости; перед использованием надо вызвать InitTaskBar - если получится создать нужный интерфейс (читай - если он есть, т.е. если мы в Win7), то вернется S_OK и значит можно вызывать функции прогресса.. хотя их можно вызывать и так, ничего не случится, но для красоты..

Ну и дальше - вызываем SetTaskBarState c:
  • TBPF_NORMAL, если будет показываться "обычный" прогресс
  • TBPF_INDETERMINATE, если надо отобразить процесс неопределенной длительности
  • TBPF_ERROR, если надо показать, что в процессе произошла ошибка (прогресс-бар окрасится в красный цвет)
  • TBPF_PAUSED, если процесс запаузили (прогресс-бар окрасится в желтый)
А для обновления прогресс-бара вызываем SetTaskBarValue, передавая значение в %% для отображения

Вот пример, как все должно работать: http://rapidshare.com/files/230523628/TaskBarDemo.zip.html

Вот как все работает (сначала надо нажать btn1 - это собственно инициализация, потом пощелкать по радиокнопкам и подвигать ползунок):
-> ->



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

Погоду смотрю в гаджете виндовом - он в RC "из коробки" наконец заработал..

четверг, 2 апреля 2009 г.

Замена кадров в 3gp файле

Нужен код, реализующий с помощью ffmpeg замену выбранных исходных кадров в 3gp видео на свои.

Не так все просто на самом деле с этим.. если бы мне надо было для моих проектов, я бы может и попарился, а так - времени нет

Смысл в том, что тут есть может не очень очевидная проблема: (очень грубое описание) при кодировании видео кодер берет картинку первого кадра и упаковывает ее каким-нибудь продвинутым способом - этот кадр называется "ключевым"; затем берется картинка следующего кадра, определяются различия с предыдущей картинкой и упаковывается только различие между кадрами, так продолжается до следующего ключевого кадра (частота которых может задаваться)

При распаковке декодер распаковывает ключевой кадр, получает полную картинку; затем распаковывается только "разница" картинок и накладывается на предыдущий кадр, получаем 2-й кадр полностью

А теперь скажем надо заменить 5-й кадр в видеоряде: если просто вставить на место 5-го кадра свой упакованный кадр, даже отметив, что он ключевой - как декодер декодирует и покажет 6-й кадр? Он ведь декодирует только разницу в картинках и наложит ее на вставленый кадр - получим мешанину на экране, мешанина будет видна какое-то время - пока не раскодируется очередной ключевой кадр

Метод решения в лоб - декодировать подряд все кадры, тут же кодируя их назад, в нужный момент подменяя картинку.. самый простой способ, но дурная работа при этом составит процентов 90 наверное, смотря сколько кадров подменяется..

Метод правильный - тот же способ, но только в пределах оджного GOP (group of picures, группы кадров между двумя ключевыми кадрами)

пятница, 21 ноября 2008 г.

Обновление FFMPEG

Обновил/пересобрал сегодня (21.11.2008) ffmpeg из svn-а, пофиксил хедеры паскалевские, мои проекты как будто бы работают :)

Положил на рапиду архив с готовыми dll-ками и архив с хедерами и некоторыми примерами

Архив с dll (rar, 1959 кб)
Архив с исходниками (rar, 76 кб)

четверг, 9 октября 2008 г.

вторник, 23 сентября 2008 г.

FFMPEG: пример

Вот тут лежит обьяснение азов работы с ffmpeg-ом (блин, ну не с ffmpeg-ом конечно, а с библиотеками из проекта), спортировал пример на паскаль, положил на рапиду архив

Чтобы понять, с какой стороны подойти к сабжу, подойдет - там и чтение файла, и декодирование, и ресемплинг картинки

Отсебятины добавил - swscale вместо imgconvert (ибо deprecated) и процедурку сохранения картинок, чтобы посмотреть на результат

Лежит вот - http://rapidshare.com/files/147700653/testProject.zip.html

Почему игнорируют UAC?..

Задолбало... ладно я на первых порах игнорировал существование UAC (User Account Control), потому что не очень представлял себе, что это... а наши тестеры до сих пор предпочитают у себя его отключать, чтобы потом долго выяснять у юзеров - как же так, у нас все работает...

Но проблема с uac есть у пунто свитчера - он свои исключения пытается добавлять в файл, который лежит в Program Files (и в который прав на запись конечно же нет)

Но ладно пунто, он только-только стал (в 3 версии) серьезным продуктом под опекой рамблера или яндекса, какого то из поисковиков в общем; но у меня не запускалась Mass Effects упорно - но у всех же работает! Пока не сообразил запустить от имени администратора - и случилось чудо

А пишет ведь серьезная контора, не чета нам... а аналитики разные говорят, что у 80% пользователей висты uac как раз включен...

Погода, непрекращающийся дождь вгоняют в сильную хандру и депрессию, да еще и с окончанием работы над шкафом занятся нечем :'-( (ну то есть заняться то есть чем, но лень начинать)

Вчера где-то увидел/заначил ссылку - Easy electronics; прикольно, аж захотелось подоставать старые железки из ящика с хламом (который тем не менее не выбросил, когда порядок наводил)

Но лень

четверг, 11 сентября 2008 г.

ffmpeg + Delphi = лежит тут

Выложил на рапидшару последние паскальные заголовки для либ из ffmpeg, вдруг на работе комп ляпнется, svn ляпнется, дома комп ляпнется, svn ляпнется - и что делать? Рапидшара не ляпнется никогда :)

заголовки в pas (обновлено по svn на 24.09.2008)
скомпиленные dll (из svn на 07.10.2008)

вторник, 9 сентября 2008 г.

Delphi 2009

Все пугали-пугали, что когда-то наступит

sizeof (char) <> 1

Похоже наступило это время, вышла новая делфи

четверг, 4 сентября 2008 г.

ffmpeg + lame

Еще про ffmpeg - добавление поддержки lame

Сначала надо скачать исходники собственно lame и положить куда-нибудь - пусть внутрь папки ffmpeg

Дальше надо отсюда (nasm sources) скачать исходники nasm:
Распаковываем архив в c:\msys, заходим в консоль, пишем:

cd c:/msys/nasm-2.03.01
./configure --prefix=/mingw
make
make install

Затем в консоли пишем:

cd c:/ffmpeg/lame-3.97
./configure --prefix=/mingw --disable-shared --enable-nasm
make
make install


Все должно скомпилится и файлы разложиться по правильным полочкам; после чего переходим к исходникам ffmpeg и собираем все (моя цель - получить dll-ки, которые я буду использовать в своей программе):

cd c:/ffmpeg
./configure --enable-memalign-hack --enable-w32threads
--enable-libmp3lame --enable-shared --disable-static --enable-gpl
--enable-swscale --extra-cflags=-I/mingw/include/lame
--extra-ldflags=-L/mingw/lib
make
make install

Все, будто бы работает

Опять ffmpeg...

Мне опять надо пересобрать ffmpeg :( - но я то уже подкован и почти помню свои себе (недописанные правда) инструкции; инструкции обновились:

Идем на SourceForge.net в раздел MinGW - Minimalist GNU for Windows, ищем там MSYS Base System, из которого качаем:
Затем нужны файлы из раздела MinGW Runtime:
Еще нужен файл в разделе MinGW API for MS-Windows:
Из раздела GNU Binutils нужны:
Из GNU Make:
Из GCC Version 3:
Из GCC Version 4:
Делаем папку, скажем c:\msys; в эту папку распаковываем первые 4 архива. Распаковываем в таком порядке, соглашаясь на перезапись файлов; файлы из coreutils норовят распаковаться в отдельную папку - не давать.

Дальше надо в папке msys сделать папку mingw, в которую распаковать остальные архивы.

Когда все файлы на месте, надо поправить msys.bat (в c:\msys) - добавить в него первой строчкой

call "C:\Program Files\Microsoft Visual Studio 8\VC\vcvarsall.bat"

Строчка нужна, чтобы компилить windows-совместимые dll-ки (ну и студия должна быть установлена конечно для этого)

Следующий шаг - надо открыть файл c:\msys\etc\fstab и добавить в него строку

c:/msys/mingw /mingw

Чтобы не напрягать глаза, пытаясь прочитать вывод консоли, можно еще поправить строку 88 в msys.bat (или 89... смотря как добавлять вот ту строчку выше в этот файл) - вот так например

start ... Courier-16 ... -geometry 100x50 -e /bin/sh --login -i

Ну и в принципе на этом все... Запускаем msys.bat, попадаем в консоль, вводим (если исходники ffmpeg лежат скажем в c:\ffmpeg):

cd c:/ffmpeg
./configure --enable-memalign-hack --cc=gcc-sjlj --enable-libmp3lame --enable-shared
make
make install


Ждем, ждем, ждем, и через какое-то время получаем результат (проверено на "чистой" виртуалке); результат лежит в папке c:\msys\local - в bin лежат ffmpeg.exe и dll файлы (если заказывались), в include лежат *.h файлы, достаточные для использования полученных dll, в lib лежат еще какие-то файлы, которые мне не нужны, ибо пишу в делфи


пятница, 29 августа 2008 г.

Выходные, выходные!..

Ура, ура, завтра уже!..

Планов громадье: куплю флешку 4 гиговую (щоб была, сейчас обхожусь как-то 32 мегабайтами); куплю карточку памяти для PSP (поиграю наконец, а то старая развалилась, новая сдохла); может быть куплю фондюшницу; скорее всего буду делать крылышки к пиву; попробуем брецели делать; сходим к теще не день рождения

Когда только все это успеть :)




Переделал процедуру тут одну, которую копи-пастил сто лет из проекта в проект, вычитывала свойства файла; старый вариант 300 метровый файл читал за 30 секунд, новый - за 5

А всего-то ушел от TFileStream к отображаемым файлам...

вторник, 26 августа 2008 г.

Цвет -> нецвет

Пока не забыл, запишу себе новую (не помню, чтобы использовал) формулу для перевода цвета в оттенки серого: Серый = 0,299 * Красный + 0,587 * Зеленый + 0,114 * Синий или же
  red = ( red * 77 + green * 150 + blue * 29 + 128 ) / 256
  green = red
  blue = red

среда, 6 августа 2008 г.

Ненавижу флеш

Если надо сконвертировать флешку в видео, как это сделать лучше всего? Не считая конечно варианта кадр-в-кадр? Можно запустить флешку и скриншотить с заданной частотой окно плеера Можно выпендрится и сделать флешку, которая будет сама сигнализировать программе, что очередной кадр нарисован Но и в том и в другом случае есть грабли, которые заключакются в том, что: плеер (который флешку играет) НЕ гарантирует, что он проиграет ее с заданной скоростью - т.е. за секунду не обязательно будет показано то количество кадров, которое заявлено в swf файле (даже больше, явно НЕ будет показано такое количество) А раз так, то в первом случае сделаем скажем 12 кадров, в то время как плеер нарисует всего 10 - получится, что 2 кадра будут сдублированы... что на глаз очень даже заметно, особенно при невысоких fps Во втором случае за секунду сграбим те же 10 кадров вместо 12, но в видео вроде будет ожидаться 12 - "займем" из следующей секунды, из-за чего имеем рассинхрон видео и звука... Что в лоб, что по лбу - получается полная фигня