Kofee - Flash player

Processing, playback of audio and video
  • Да и ещё http://www.adobe.com/devnet/swf/pdf/swf ... ec_v10.pdf - очень толковая документация по формату swf, всё, что нужно программисту ничего лишнего. Первый раз встретилась англоязычная документация "без воды".
    Ещё если есть люди кого интересует вопрос написания флеш плеера рекомендую скачать gnash - флеш плеер, который может выдавать лог по ходу парсинга флеш флайла. Gnash можно использовать в качестве дефлешера (термин сам только что придумал по аналогии с дизассемблером, декомпилятором и т.д.), чтобы меньше времени тратить на высчитывание битовых полей, при тестировании.
    Last edited by Asper on Thu Jun 25, 2009 6:41 am, edited 1 time in total.
  • Я недавно думал написать программу, с использованием прозрачных изображений, и с градиентными переходами от одного цвета к другому.
    Asper ты можешь взять для своего плеера функцию ColSm, хотя может подобные функции у тебя уже есть

    Code: Select all

    ;input:
    ; edx = transparent color
    ; edi = background color
    ;output:
    ; edx = combine color
    ColSm:
      .........
    Attachments
    color_t.7z (1.33 KiB)
    В программе рисуется красный прямоугольник, а под ним синий цвет. А степень прозрачности разная, за счет чего получается плавный переход.
    Downloaded 455 times
  • Спасибо за код. Реализацией вывода фреймов на экран и вообще векторной графикой ещё не занимался, программа пока что делает только общий парсинг swf (не cws) файлов, и вызывает соответсвующую функцию-обработчик тега из таблицы тегов, если тег не реализован (адрес обработчика = 0) тег просто отбрасывается и парсер берется за следующий тег. На текущий момент реализован только тег № 9 - установка фонового цвета.
  • как работа с плеером , продвигается ?
    Мы не часть этого мира , мы его творцы :)
  • Пока ещё не было возможности им заняться. Написал пока что DisplayList и Dictionary. Следующий шаг скорее всего вывод shape'ов на экран.
  • Вкратце опишу работу 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 (установка фонового цвета).
  • а это возможно в дальнейшем, чтобы часть Kofee стала библиотекой для использования во всяких разных каких-нибудь ( :) ) других приложениях?
    И мы уже давно не пешки,
    Мы пули, мы орлы, и решки!
    Война ютит бинарный код,
    Умри, или иди вперед!
  • Так и задумывалось, но на этапе разработки мне проще зашить весь код в программу. Когда станет более-менее юзабельно сделать библиотеку не составит труда, а Kofee как флэшплеер будет вызывать функции из этой библиотеки.
  • думаю, нам для Kofee и программной реализации viewtopic.php?f=2&t=1489 не помешает разработать или улучшить существующую какую-нибудь библиотеку, позволяющую формировать в памяти изображения на основе примитивов, кривых Безье, поддерживающую сглаживание, обводки объектов разными типами линий, и т.п.
    Есть идеи?
    И мы уже давно не пешки,
    Мы пули, мы орлы, и решки!
    Война ютит бинарный код,
    Умри, или иди вперед!
  • Посмотрел 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, обозначает обрезку буфера справа
  • Вообще работа остановилась на том, что для Dictionary и DisplayList нужен обычный аллокатор памяти, который будет выделять столько памяти, сколько запрошено, а не целую страницу на каждую мелочь. Я старался писать Kofee "оптимально" и такой расход памяти мне не нравится. Вообще аллокатор по-моему можно написать и в третьем кольце на основе текущей сис. функции выделяющей память, только вот писать менеджер памяти мне не хочется.
    Какие есть предложения?
  • Asper wrote: Какие есть предложения?
    Статично зарезервировать.
  • Mario wrote:Статично зарезервировать.
    Нельзя. Во-первых я уже сказал, что стараюсь оптимизировать программу, где могу. Во-вторых нельзя предугать размер памяти, которая может понадобиться. Файлы swf могут содержать от нескольких тегов до нескольких тысяч.
  • Asper
    "Мелкие" аллокации для приложений нужны, но реализовать их на практике с нынешним менеджером памяти очень сложно. Он в принципе не может отслеживать блоки меньше 1 страницы. "Ядерный" malloc() работает только благодаря инвариантности верхних линейных адресов. В нижнем адресном пространстве будет чехарда при переключении задач.

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

    Users browsing this forum: No registered users and 6 guests