Page 1 of 3

Kofee - Flash player

Posted: Mon Jun 15, 2009 8:56 pm
by Asper
Всем привет!
Начинаю реализовывать понемногу своё желание иметь флеш плеер в Колибри.
Об этом своём желании я уже упоминал раньше в теме про fliplayer viewtopic.php?f=9&t=1172
Вот здесь пока только заготовка на будующее http://ftp.kolibrios.org/users/Asper/Kofee/

P.S. Давно ничего не писал и даже не было времени заглянуть на форум, но я непременно вернусь к активной деятельности. Вот только дипломную работу сдам. :)

Re: Kofee - Flash player

Posted: Mon Jun 15, 2009 9:32 pm
by Asper
Да и ещё http://www.adobe.com/devnet/swf/pdf/swf ... ec_v10.pdf - очень толковая документация по формату swf, всё, что нужно программисту ничего лишнего. Первый раз встретилась англоязычная документация "без воды".
Ещё если есть люди кого интересует вопрос написания флеш плеера рекомендую скачать gnash - флеш плеер, который может выдавать лог по ходу парсинга флеш флайла. Gnash можно использовать в качестве дефлешера (термин сам только что придумал по аналогии с дизассемблером, декомпилятором и т.д.), чтобы меньше времени тратить на высчитывание битовых полей, при тестировании.

Re: Kofee - Flash player

Posted: Mon Jun 15, 2009 10:47 pm
by IgorA
Я недавно думал написать программу, с использованием прозрачных изображений, и с градиентными переходами от одного цвета к другому.
Asper ты можешь взять для своего плеера функцию ColSm, хотя может подобные функции у тебя уже есть

Code: Select all

;input:
; edx = transparent color
; edi = background color
;output:
; edx = combine color
ColSm:
  .........

Re: Kofee - Flash player

Posted: Mon Jun 15, 2009 10:59 pm
by Asper
Спасибо за код. Реализацией вывода фреймов на экран и вообще векторной графикой ещё не занимался, программа пока что делает только общий парсинг swf (не cws) файлов, и вызывает соответсвующую функцию-обработчик тега из таблицы тегов, если тег не реализован (адрес обработчика = 0) тег просто отбрасывается и парсер берется за следующий тег. На текущий момент реализован только тег № 9 - установка фонового цвета.

Re: Kofee - Flash player

Posted: Fri Sep 04, 2009 5:12 pm
by chaykin
как работа с плеером , продвигается ?

Re: Kofee - Flash player

Posted: Thu Sep 10, 2009 11:21 am
by Asper
Пока ещё не было возможности им заняться. Написал пока что DisplayList и Dictionary. Следующий шаг скорее всего вывод shape'ов на экран.

Re: Kofee - Flash player

Posted: Sun Aug 22, 2010 8:13 pm
by Asper
Вкратце опишу работу Kofee (текущей версии).

Сейчас плеер состоит из 6 модулей:
1. Kofee.asm - Основной модуль плеера.
2. DisplayList.inc - Модуль отвечающий за работу со словарем (Dictionary) и Списком Отображения (DisplayList). Пока не доработан.
3. tags.inc - Содержит таблицу тегов (массив указателей на функции) и функции-обработчики тегов.
4. bitStream.inc - Предназначен для работы с битовыми полями. Пока содержит одну функцию Read_Bitfield для чтения битового поля заданной длины с указанной позиции (адрес первого байта битового поля в памяти и номер первого бита битового поля в указанном байте).
5. dataTypes.inc - Типы данных SWF.
6. aspAPI.inc - Функции API KolibriOS.

Алгоритм работы программы.

Code: Select all

ProcessFile:  ; Общая процедура обработки файла.
    call     ReadHeader         ; Считываем заголовок SWF файла.
    jc	     .out              ; если файл не SWF то выход.
    call     Memory_Init         ; На основе информации полученной из заголовка инициализируем память.
    jc	     .out               ; если ошибка то выход
    call     ReadFile2Memory ; Считываем весь файл в память
    jc	     .out               ; если ошибка ФС то выход 
;    call     ResizeWindowToFrame  ;Если раскомментировать эту строку, то окно будет 
                                                    ;  автоматически изменено до размеров фрейма.
    call     ParseSWFFile       ; Процедура общего парсинга SWF файла.
    jc	     .out
    call     Memory_Done       ; Освобождение памяти.      
  .out:                                 ; Выход.
    ret



proc ParseSWFFile stdcall
    locals
      lTag		dw ?
    endl

    mov     esi, dword [Buffer]
    add     esi, dword [file_header_size]
    xor     ecx, ecx
  .next_tag:
    ; Read tag (Читаем тег)
    lodsw

    mov     word [lTag], ax
    mov     ebx, eax
    and     ebx, 0xFFC0
    shr     ebx, 6	 ; ebx = tag type
    and     eax, 0x3F	 ; eax = tag length

    cmp     eax, 0x3F	 ; is long tag ? (длинный тег?)
    jne     @f
    lodsd
  @@:


    if DEBUG
       pusha

       stdcall bar, 90, 150, 50, 50, 0;x3377
       ; TagType
       stdcall prints, 10, 150, dbgTagType, TEXTCOLOR
       stdcall print_num, 90, 150, ebx, 0, NUMCOLOR
       ; TagLen
       stdcall prints, 10, 160, dbgTagLen, TEXTCOLOR
       stdcall print_num, 90, 160, eax, 0, NUMCOLOR
       ; TagEnd
       stdcall prints, 10, 170, dbgTagEnd, TEXTCOLOR
       add     eax, esi
       sub     eax, dword [Buffer]
       stdcall print_num, 90, 170, eax, 0, NUMCOLOR
       ; TagIndex
       stdcall prints, 10, 190, dbgTagIndex, TEXTCOLOR
       stdcall print_num, 90, 190, ecx, 0, NUMCOLOR
       popa
    end if

    cmp     ebx, TAGS_NUM    ; Skip tags with TagType field greater then the TagsTable
    jg	    @f                    ; Пропускаем тег, если значение поля TagType больше размера таблицы тегов

    mov     edi, TagsTable
    shl     ebx, 2 ; ebx*=4
    add     edi, ebx
    shr     ebx, 2
    cmp     dword [edi], 0
    je	    @f
    call    dword [edi]   ; Call the tag service routine (Вызов функции-обработчика тега)
    jc	    .err_out
  @@:
    add     esi, eax
    mov     dword [filepos], esi
    inc     ecx

       mov     eax, 11		   ; Test if there is an event in the queue. (Не забываем реагировать на события KolibriOS).
       int     0x40
       call	ProcessEvent

;	    cmp     ebx, 2   ; DEBUG: Terminate on the tag type = ebx  ; А это для отладки
;	    je	    .out

	    ;cmp     ecx, 2   ; DEBUG: Terminate on the tag number = ecx ; И это для отладки тоже
	    ;je      .out
    ; Test that the filepointer esi not greater than start of the Buffer + FileLength
    ; Проверка на то, чтобы указатель текущего смещения, содержащийся в esi не больше 
    ;    чем начало буфера данных (SWF файл в памяти)  Buffer +  длина файла FileLength
    mov     eax, esi
    sub     eax, dword [Buffer]
    cmp     eax, dword [FileHeader.FileLength]
    jg	    .err_out

    test    ebx, ebx ; tag type = 0 <- 'End' tag 
    jnz     .next_tag

;    cmp     eax, dword [FileHeader.FileLength]  ; Does 'End' tag for a sprite ?
;    jl      .next_tag                           ; if yes - continue loop

  .out:
    clc
    ret
  .err_out:
    stc
    ret
endp
В настоящее время реализована, только функция-обработчик тега № 9 (установка фонового цвета).

Re: Kofee - Flash player

Posted: Sun Aug 22, 2010 11:24 pm
by Gluk
а это возможно в дальнейшем, чтобы часть Kofee стала библиотекой для использования во всяких разных каких-нибудь ( :) ) других приложениях?

Re: Kofee - Flash player

Posted: Sun Aug 22, 2010 11:31 pm
by Asper
Так и задумывалось, но на этапе разработки мне проще зашить весь код в программу. Когда станет более-менее юзабельно сделать библиотеку не составит труда, а Kofee как флэшплеер будет вызывать функции из этой библиотеки.

Re: Kofee - Flash player

Posted: Sun Oct 03, 2010 6:34 pm
by Gluk
думаю, нам для Kofee и программной реализации viewtopic.php?f=2&t=1489 не помешает разработать или улучшить существующую какую-нибудь библиотеку, позволяющую формировать в памяти изображения на основе примитивов, кривых Безье, поддерживающую сглаживание, обводки объектов разными типами линий, и т.п.
Есть идеи?

Re: Kofee - Flash player

Posted: Thu Oct 07, 2010 2:33 pm
by Asper
Посмотрел Pixlib, Buf2D, libGFX, gb_lib. Больше всего подходит Buf2D как наиболее развитая библиотека.
Spoiler:
Вступление
Документация к свободной библиотеке buf2d.asm, для ОС Колибри. Эта библиотека создана для работы с 2d изображениями. С ее помощьью можно создавать буфера с изображениями в памяти, и при необходимости выводить их на экран. Изображения можно накладывать одно на другое, поддерживается работа с прозрачными изображениями, есть функция рисования лини пока на этом все.

Последнее обновление библиотеки 30.07.10.

Форматы буферов
Поддерживается 3 формата буферов. Каждая функция при работе с буферами может быть расчитана на работу с определенными форматами изображений.

8 бит
Сожержит альфа канал a (прозрачность) изображения. На экран не выводится. Используется для созданя 32-битных буферов.

24 бит
Данный буфер содержит изображение в формате rgb. Может выводится на экран.

32 бит
Содержит прозрачное изображение в формате rgba. На экран не выводится. Используется для наложения изображений.

Функции
Почти все функции 1-м параметром принимают указатель на структуру буфера, из которой могут использоваться параметры, нужные для работы конкретной функции. Пример структуры буфера изображения:

align 4
buf_0:
dd 0 ;+ 0 указатель на буфер изображения
dw 100 ;+ 4 отступ слева
dw 10 ;+ 6 отступ справа
dd 150 ;+ 8 ширина
dd 100 ;+12 высота
dd 0x80 ;+16 фоновый цвет
db 24 ;+20 бит на пиксель
lib_init
Эта функция получает указатели на функции работы с памятью, вызыватся должна при загрузке библиотеки. Можете использовать макрос @use_library_mem, для ее автоматической настройки.

buf2d_create
Создает буфер и чистит его фоновым цветом.

buf2d_create_f_img
Создает буфер на основе изображения в формате rgb.

buf2d_clear
Чистит буфер фоновым цветом.

buf2d_draw
Рисует буфер на экране (работает через системную ф. 7). Рисуются только буфера с глубиной цвета 24 бита.

buf2d_delete
Освобождает память занятую изображением буфера.

buf2d_line
Рисует в буфере линию с заданным цветом и координатами. Пример использования:

stdcall [buf2d_line], buf_0, 30,10, 110,70, 0xffff00 ;рисуем линию
где buf_0 - структура буфера в котором будет рисоваться линия; 30, 10, 110, 70 - координаты линии; 0xffff00 - цвет линии.

buf2d_rect_by_size
Рисует прямоугольник, по двум координатам, 2-я координата задана по размеру.

stdcall [buf2d_rect_by_size], buf_0, 10,10,150,100, 0x8080
где buf_0 - структура буфера в котором будет рисоваться прямоугольник; 10, 10 - координаты левого верхнего угла; 150, 100 - размер прямоугольника; 0x8080 - цвет линии.

buf2d_circle
Рисует в буфере окружность с заданным цветом и радиусом. Пример использования:

stdcall [buf2d_circle], buf_0, 25, 70, 15, 0xff0000
где buf_0 - структура буфера в котором будет рисоваться окружность; 25, 70 - координаты центра; 15 - радиус; 0xff0000 - цвет.

buf2d_img_hdiv2
Сжимает изображение в буфере по высоте в 2 раза, при этом размер самого буфера не уменьшается.

buf2d_img_wdiv2
Сжимает изображение в буфере по ширине в 2 раза, при этом размер самого буфера не уменьшается.

buf2d_conv_24_to_8
Преобразование буфера из 24-битного в 8-битный. При преобразовании указывается какой цвет берать: 0-синий, 1-зеленый, 2-красный. Остальные цвета при преобразовании теряются.

buf2d_conv_24_to_32
Преобразование буфера из 24-битного в 32-битный. При преобразовании указывается также 8-битный буфер, который будет использован для создания альфа канала. Пример:

stdcall [buf2d_conv_24_to_32],buf_a,buf_b ;делаем буфер rgba 32бит
До выполнения функции буфер buf_a должен быть 24 битным, а буфер buf_b - 8 битным. После выполнения функции буфер buf_a станет 32 битным, буфер buf_b не изменится.

buf2d_bit_blt
Рисует в буфере изображение из другого буфера в указанных координатах. Буфер в котором рисут (приемник) должен быть 24 битным, а тот который рисуется (источник) 24 или 32 битным. Если буфер источник 32 битный, то его прозрачность при рисовании не учитывается, для учета прозрачности используется функция buf2d_bit_blt_transp.

buf2d_bit_blt_transp
Рисует в буфере изображение из другого буфера в указанных координатах, при этом учитывается прозрачность. Буфер который будет нарисован должен быть 32 битным, а тот в котором рисуют 24 битным.

buf2d_bit_blt_alpha
Рисует в буфере изображение из другого буфера в указанных координатах, при этом учитывается прозрачность. Буфер который будет нарисован должен быть 8 битным, а тот в котором рисуют 24 битным.

buf2d_cruve_bezier
Рисует по трем точкам отрезок кривой безье.

buf2d_convert_text_matrix
Преобразует матрицу с текстом размером 16*16 в размер 1*256. Необходимо для создания матрицы для рисования текста. Перед использованием данной функции предполагается что есть изображение с полным набором символов размером 16 столбцов на 16 строк, из которого предварительно был создан 8 битный буфер.

stdcall [buf2d_create_f_img], buf_1,[image_data] ;создаем буфер 24 бит на основе данных изображения
stdcall [buf2d_conv_24_to_8], buf_1,1 ;делаем буфер прозрачности 8 бит
stdcall [buf2d_convert_text_matrix], buf_1
где buf_1 - структура буфера для формирования текстовой матрицы; image_data - данные изображения текстовой матрицы в формате rgb, размером 16*16 символов.

buf2d_draw_text
Рисует текст в буфере, используя матрицу с текстом размером 1*256 символов. Пример:

stdcall [buf2d_draw_text], buf_0, buf_1,some_text,20,10,0x4040ff ;рисуем строку с текстом
где buf_0 - структура буфера в котором будет рисоваться текст; buf_1 - структура буфера с текстовой матрицей в формате 8 бит, размером 1*256 символов; some_text - текст, который будет выведен в буфер buf_0.

buf2d_crop_color
Обрезание буфера, по указанному цвету. Функция используется для уменьшения памяти, занимаемой буфером. Отрезаются крайние части буфера имеющие одинаковый цвет. Пример:

stdcall [buf2d_crop_color], buf_0,0xffffff,BUF2D_OPT_CROP_TOP+BUF2D_OPT_CROP_BOTTOM
где buf_0 - структура буфера который будет обрезан; 0xffffff - цвет по которому будет обрезаться буфер; BUF2D_OPT_CROP_TOP и BUF2D_OPT_CROP_BOTTOM - константы, указывающие с каких сторон обрезать буфер.

buf2d_offset_h
Сдвиг изображения в буфере по высоте вверх или вниз.

Константы
BUF2D_OPT_CROP_TOP equ 1
Константа для функции buf2d_crop_color, обозначает обрезку буфера сверху

BUF2D_OPT_CROP_LEFT equ 2
Константа для функции buf2d_crop_color, обозначает обрезку буфера слева

BUF2D_OPT_CROP_BOTTOM equ 4
Константа для функции buf2d_crop_color, обозначает обрезку буфера снизу

BUF2D_OPT_CROP_RIGHT equ 8
Константа для функции buf2d_crop_color, обозначает обрезку буфера справа

Re: Kofee - Flash player

Posted: Thu Oct 07, 2010 5:53 pm
by Asper
Вообще работа остановилась на том, что для Dictionary и DisplayList нужен обычный аллокатор памяти, который будет выделять столько памяти, сколько запрошено, а не целую страницу на каждую мелочь. Я старался писать Kofee "оптимально" и такой расход памяти мне не нравится. Вообще аллокатор по-моему можно написать и в третьем кольце на основе текущей сис. функции выделяющей память, только вот писать менеджер памяти мне не хочется.
Какие есть предложения?

Re: Kofee - Flash player

Posted: Thu Oct 07, 2010 6:08 pm
by Mario
Asper wrote: Какие есть предложения?
Статично зарезервировать.

Re: Kofee - Flash player

Posted: Thu Oct 07, 2010 6:25 pm
by Asper
Mario wrote:Статично зарезервировать.
Нельзя. Во-первых я уже сказал, что стараюсь оптимизировать программу, где могу. Во-вторых нельзя предугать размер памяти, которая может понадобиться. Файлы swf могут содержать от нескольких тегов до нескольких тысяч.

Re: Kofee - Flash player

Posted: Thu Oct 07, 2010 6:28 pm
by art_zh
Asper
"Мелкие" аллокации для приложений нужны, но реализовать их на практике с нынешним менеджером памяти очень сложно. Он в принципе не может отслеживать блоки меньше 1 страницы. "Ядерный" malloc() работает только благодаря инвариантности верхних линейных адресов. В нижнем адресном пространстве будет чехарда при переключении задач.

Я сейчас работаю над принципиально новым "деревянным" менеджером памяти для Колибри-А, хочу также встроить туда и "мелкий" сервис.
До конца года надеюсь успеть.
Пока можешь работать со страничками, только помечай где в коде надо будет переделывать на malloc()