H.264 декодер на JavaScript

    Прежде чем отправить публикацию, крепко задумался, какой блог выбрать: JavaScript или Ненормальное программирование. Так или иначе круг задач, которые можно решить на детище Нетскейпа расширяется с каждым днем.

    Так например разработчики из команды Mozilla смеха ради сделали H.264 декодер на JavaScript. Любопытно, что скрипт при этом не был написан вручную.


    Он был получен путем копиляции Си-шных исходников существующего декодера в формат LLVM, с последующей трансформацией полученного байткода в JavaScript при помощи компилятора Emscripten. Именно этот компилятор привлек изначально внимание отца JavaScript-а Брендана Айка,
    который поделился своими впечатлениями (а впечатлить его не просто) на одной из конференций,
    которую добрые люди сняли на видео,
    которое тут же оказалось в сети,
    чтобы вызвать у меня непроизвольное wow!,
    и незамедлительно поделиться находкой со знающими толк в извращениях хабрачеловеками!

    Итак, в ходе демонстрации скрипт генерирует 30 фреймов в секунду, будучи при этом совершенно сырым и не обработанным напильником вторичным продуктом демки возможностей Emscripten. Тем не менее, резонанс в общественности был велик, и команда разрабов Mozilla решила под натиском просьб и угроз выложить демку вместе с сорцами в качестве отдельного оупен-сорс-прожекта на гитхаб.

    Мне думается, что распределив вычисления на несколько ядер и воспользовавшись дополнительными возможностями аппаратно-ускоренного HTML5 можно в итоге получить действительно полезную приблуду в коллекцию Web-разработчика.
    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More
    Ads

    Comments 51

      +13
      Я так понимаю, разработка оплачена производителями процессоров? Надо же куда-то девать мощь новых чипов:)
        +1
        Точь-в-точь такая же мысль возникла и у меня. Наверное Intel спонсирует подобные проекты.
        0
        А напомните-ка, уважаемые мсье, операционку на JavaScript уже написали? :)
          +6
          Да.
          • UFO just landed and posted this here
              +3
              Там эмулятор компьютера на js. Про операционку на js там речи нету.
                0
                Linux, который крутится под этим компьютером, уже не ОС?
                  +1
                  Ну Linux-то никто не переписывал на JavaScript.
                    0
                    Я надеюсь, вы не считаете, что linux написан на js?
                      –1
                      Нет. Но тем не менее, в итоге получается ОС, работающая на js. А работает она под эмулятором или написана на js — это уже детали реализации
                    0
                    Ну, я когда-то писал операционку на JS :) Давно это было. Называлась JUnix :)
                  0
                  Ну уж эмуляторы старых компов (в данном случае ZX Spectrum) вовсю пишут: ispeccy.com
                    0
                    В тему к операционкам на джаваскрипте — runtimejs.org. Любопытно. Проект новый.
                    +12
                    смеха ради

                    Вот это чувство юмора, мне бы так шутить…
                      +3
                      Пожалуйста, выложите куда-то рабочую демку.
                        +1
                        Линк на гитхаб в статье. Если не пользуетесь git, можете просто скачать snapshot проекта. Для тестов авторы рекоммендуют Firefox Nightly Build.
                          0
                          Добавлю, что демка лежит в каталоге Broadway/Demo/broadway.html
                          –29
                          Это будет называться «слайдшоу 1 кадр в час»?
                            +14
                            Ну написано же «ходе демонстрации скрипт генерирует 30 фреймов в секунду». Почему бы не почитать статью прежде чем комментировать?
                              +12
                              Для H.264 «30 кадров в секунду» — это как сказать: «этот декодер распакует zip файл за 20 секунд», при этом опустив: какого он размера, какая степень сжатия.
                                +3
                                Некоторые параметры демо последовательности admiral.264 (480x272, 9 378 028 байта):
                                profile: Baseline(idc:66)
                                энтропийный кодер CAVLC (сравнительно простой, лучшие результаты даёт CABAC)
                                только inter предсказание
                                остальное приводить не буду, но уже ясно что касается сжатия, то оно очень средненькое.

                                Ещё не хватает данных о стендовой конфигурации (я не смог найти). Считаю демо незаконченным без грязных технических подробностей :).

                                  +1
                                  Мой тест:
                                  win32 (3 Gb RAM, CPU: Intel Core 2 Duo E8400)
                                  admiral.264:
                                  Average FPS (All / Steady) 49.54 49.11
                                  Elapsed 56.63
                                  mozilla.264:
                                  Average FPS (All / Steady) 47.48 47.99
                                  Elapsed 111.90

                                  При динамичной смене кадров fps падал до 25. Результаты в целом неплохие.
                                  Основой JS декодера является PacketVideo(C++). Беглый обзор исходников показывает что декодер должен поддерживать FMO(это восстановление повреждённых макроблоков вроде) и intra предсказание.

                                  Считаю что разработчики подкладывали cебе слишком лёгкие последовательности :>

                                  Позже попробую что-нибудь действительно сложное ему подсунуть. :)
                                  –5
                                  Где параметры? Или вы хотите сказать, что этот декодер сможет отображать 1020p с шестиканальным звуком?
                                    +5
                                    Разговор только что шел о кадре в час. И покажите мне H.264 декодер, который звук отображает, чисто поржать.
                                0
                                Когда вижу такие посты мне кажется что люди все еще не поняли что js полноценный язык, если бы декодер написали на C то врятле бы об этом написали на хабр, а про js пишут как если бы декодер был написан на брейнфаке, обидно за js.
                                  +4
                                  JS просто считают очень медленным. Если вы помните, то тут кто-то сделал видеопроигрыватель из кассового аппарата. По сути ведь, ну подумаешь, что там: просто ассемблер. Но ведь всем очевидно, что сделать это могут лишь еденицы.
                                  P.S. И на крайний случай: я не наезжаю на JS.
                                    –5
                                    Каждый инструмент должен знать свое место. JS был разработан для client-side в веб-технологиях. Не надо пытаться распространять его на то, что он делать не может (хотя, конечно, уже есть WebGL и WebCL — на JS можно и отличную 3D-графику безо всякого торможения выводить, и даже элементарные расчеты на GPU делать).
                                      +1
                                      Дело все в том, что JS «стал» серьезным языком совсем недавно. В кавычках, потом что сам JS никак особенно не изменился, поменялись представления разработчиков о скриптовых языках. За что, кстати, спасибо в первую очередь Питону и Руби.
                                        +1
                                        Поменялось отношение со стороны разработчиков браузеров. Такие эксперименты вынуждают к пискомерству и оптимизации JS-движков. Как следствие — меньше потребление ресурсов и более высокая скорость работы и возможность еще больше творить на клиенте.
                                          0
                                          Памяти современные движки больше кушают. А в конечном итоге JS же стал фактически компилируемым языком программирования.
                                            0
                                            В смысле?
                                          +1
                                          > JS «стал» серьезным языком совсем недавно

                                          Да просто количество памяти на машинах увеличилось. Сейчас 4Гб это как бы почти стандарт. И у тех кто пишет на JS и других скриптовых языках кажется что памяти бесконечное количество, ну по крайней мере пока не запускается несколько виртуальных машин.
                                            +1
                                            Если у чела не идет игрушка, мы без зазрения совести ему говорим: «Проапгрейдь тачку». Почему же мы должны стесняться такого ответа, если у кого-то «не идет интернет»?
                                              0
                                              Потому что в отличие от игрушки, я не вижу ради чего я должен апгрейдить комп. Плюсы-то какие? Ради моды? Или поддержки компании Intel, которой надо сбывать все более мощные чипы?
                                                0
                                                Очень большой процент своего времени пользователи находятся в браузере. В веб клиенты переползла почта, в облака ушли файлы, видео и аудио больше нет нужды хомячить на винте. Даже офис медленно, но верно утекает в сеть. Скоро, уверен, и ИМ-клиенты обзаведутся веб-мордой. Вот они и плюсы.
                                                  0
                                                  И как из этого следует необходимость использования декодеров на js? Чем это лучше использования браузером декодера из системы?
                                                    0
                                                    в системе может элементарно не оказаться нужного декодера
                                                      0
                                                      И поэтому вместо предложения скачать — запускаем нечто тормозное на js?
                                        +6
                                        Kill it with fire!
                                          +1
                                          На видео показывают российский фильм Адмирал с Хабенским…
                                          Копирастеры вы где? )
                                          А по сабжу круто сделали, скоро походу много чего будет еще написано
                                            +1
                                            Неплохо. Но лучше, конечно, LLVM запускать прямо в браузере, без промежуточного JS. Google что-то на эту тему придумывает, может и другие подтянутся.
                                              0
                                              Именно это я считаю лучшим решением, компиляция и оптимизация кода (js/c/...) происходит в платформо-независимый ассемблер (байт-код). А у клиента *во время инсталляции* он перегоняется в платформо-зависисмый код+оптимизация+проверка безопастности…
                                                0
                                                Это называется .NET и уже давно используется в Silverlight.
                                                  +1
                                                  У .NET/Silverligh есть одна критическая проблема…
                                                    +2
                                                    <trollmode>Заключающая в его существовании?</trollmode>
                                                      0
                                                      Например, заключающаяся в том, что иметь дело с Майкрософт может быть чревато в плане патентной чистоты, и выясниться это может отнюдь не сразу (как в случае FAT с длинными именами).
                                                      Вторая — что сишный/плюсовый код (вроде того самого декодера) мы тогда использовать не сможем — очевидно, что платформа будет поддерживать только managed код. Что, к тому же, отсекает ещё кучу языков. Ну и как ложатся всякие скриптовые языки на .NET я тоже не уверен. На JVM, к примеру — с трудом, насколько я знаю.

                                                      В этом слысле NaCl для десктопа (не учитывая мобильные платформы) смотрится куда лучше — одна сборка под x86 будет работать везде, если надо — можно еще 64-битный вариант сделать. Что на мобильных я не в курсе — там, конечно, ARM везде, но очень уж разный он бывает…
                                                        +3
                                                        Точнее, «фатальный недостаток».
                                                  +1
                                                  Хорошая замена для APNG/AJPG
                                                    0
                                                    Мозиллушка! WebM, пожалуйста! А лучше сразу ffmpeg!
                                                      0
                                                      А лучше — нативный ffmpeg (можно в комплекте с мозиллушкой, но лучше — системный, где возможно)…

                                                    Only users with full accounts can post comments. Log in, please.