Пользователь
0,0
рейтинг
21 июля 2014 в 14:19

Разработка → 1 января 1904, 1970, Youtube, международный конфликт и кривые руки

К сожалению, давно пропали топики-ссылки, но иногда бывают крайне занимательные вещи из первых рук. Рекомендую пост Анатолия Воробея (работает разработчиком в «Гугле»).

В видеоформате MP4 (стандарт MPEG-4) есть возможность записать «время создания» любого потока данных, с помощью специальной метки. Значение этой метки в стандарте: количество секунд, прошедших с 1 января 1904 года, или так называемое «время по эпохе макинтоша», потому что маки первыми стали использовать такой отсчет времени. Меж тем, в современных серверах намного проще иметь дело с «временем по эпохе Юникса», а именно количеством секунд, прошедших с 1 января 1970 года. В результате этого, во множестве программ, которые работают на Линуксе или других юниксовских операционных системах, есть кусок кода, который выглядит примерно так:
  • получить «время сейчас по юниксу»;
  • добавить разницу между временем по юниксу и временем по макинтошу — это некая константа;
  • полученное «время сейчас по макинтошу» записать в файл MP4, который мы создаем.

Чему равна константа «разница между временем по юниксу и временем по макинтошу»? Она равна в точности числу секунд, прошедших между 1 января 1904 и 1 января 1970. Это 66 лет, из которых 17 были високосными (проверьте, если не доверяете мне). Всего дней получается: 66 * 365 + 17 = 24 107, а секунд, учитывая 86 400 секунд в сутках: 24 107 * 86 400 = 2 082 844 800. Это правильное значение константы.

Но есть маленькая крохотная незаметная проблемка. Часть стандарта MPEG-4 — исходники библиотек, которые умеют читать и писать mp4-файлы, так reference software на C++, которым все могут пользоваться, чтобы позаимствовать или сравнить со своим кодом. Полное название этой части стандарта: ISO/IEC 14496-5. Если вам интересно, вы можете скачать эту часть стандарта бесплатно с официального сайта. И если вы посмотрите на исходники, то увидите, что там используется другое значение этой константы, а именно 2 082 758 400. Это ровно на 86 400 секунд, то есть на одни сутки, меньше правильного значения.

Как случилось, что создатели MPEG-4 неправильно посчитали разницу между двумя датами? Может, кто-то вручную считал високосные годы и ошибся? Не знаю. Так или иначе, неправильное значение из-за его присутствия в стандарте попало во множество библиотек для чтения и записи видеоформатов. Постепенно в последние годы правильное значение начинает его сменять; если вы поищете в гугле оба числа, то увидите несколько точных описаний проблемы в исходниках нескольких проектов: «Стандарт предлагает использовать 2 082 758 400, но правильное значение 2 082 844 800». В других проектах правильное значение стоит просто потому, что они сами посчитали, исходя из определений эпох, а не пользовались исходниками из стандарта.

Если в библиотеке, которая создает для вас MP4-файл, записано неправильное значение, то что произойдет, когда она захочет записать время «сейчас»? Она возьмет правильное число секунд по юниксу, добавит константу на сутки меньше, чем надо, и получит тем самым число секунд, согласно эпохе макинтоша, которое соответствует времени на сутки раньше. Я послал описание проблемы и решения разработчикам Ютьюба, и надеюсь, что вскоре этот баг исчезнет.

Все в этом мире взаимосвязано. Кривые руки авторов стандарта MPEG-4 приводят к конспиративным теориям в украинском конфликте. Так и живем.
@Piskov
карма
41,8
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое Разработка

Комментарии (25)

  • +24
    Еще бы хотя бы в двух словах о теориях, хотелось бы почитать.
    • +29
      Ребята, а за что меня сливают? я честно не в курсе что за конспиративная теория в украинском конфликте, на которую могут повлиять кривые руки авторов стандарта МР4. Просто хотелось бы в двух словах хотя бы узнать, а вместо этого получаю тучу минусов. Хотя ниже уже скинули ссылки. Уже понятно.
      • +1
        Возможно, конфликт сам по себе ни при чем: здесь многие ревностно чтят первое в списке правил Хабра. В чем-то их можно понять: ЖЖ аввы достаточно популярен и без Хабра, к тому же в толксах уже обсудили еще вчера тему подняли на Y и реддите.
      • +4
        Началась истерия в связи с аудиозаписью, которую выложила СБУ касательно переговоров сепаратистов после падения Боинга, который вначале принимали за Ан-26. Там что-то вроде 28 часов разницы, вызванных этой погрешностью и разницей в часовых поясах.
      • +7
        Для тех, кто не в теме: www.echo.msk.ru/blog/echomsk/1361856-echo/ К ней в разного качества ресурсах появилось много претензий, в том числе, что она была сделана до известных событий, т. к. дата создания в метаданных раньше на сутки. Оказалось, что это ОК и баг стандарта. Насколько остальное правда в самой записи — не формат Хабра.
      • 0
        Может нечто вроде этого:)

        Таврило останавливается и начинает чистить камуфляж. Его сбивает вылетевший из-за угла грузовик с покрышками, Таврило в тот вечер не выходит на трибуну майдана, Янукович еще на полгода сохраняет свой золотой батон, Крым остается украинским, Обама не обзывает Россию региональным бастионом реакции, и все остальные колеса истории, большие и малые, не приходят в движение. Направление, в котором сместится равновесие мира, зависит от того, попадет ли окурок в сотника в нужный момент.
        Представим себе, что из-за возникшего в мире дисбаланса стоящему на балконе курильщику, уже дотягивающему свою сигарету на февральском ветру, собирается позвонить ушедшая по революционным делам жена, из-за чего курильщик не затянется в последний раз и окурок полетит вниз слишком рано.
        Жена курильщика, готовая сделать роковой звонок, ушла на самом деле не жарить пирожки для воинов света, как наврала мужу — она спустилась на другой этаж, где ее трахает приезжий активист из Тернополя. Этот активист еще может спасти братство славянских народов, если закончит процедуру на полминуты позже и звонок опоздает…
        Но для этого жена курильщика должна выглядеть менее привлекательно — у нее под глазом должен быть замазанный тональным кремом синяк… Который ей три дня назад могла поставить вредная гражданка, поспорившая с ней в метро о месте Симона Петлюры в украинской истории… Но для этого у вредной гражданки должен быть с собой тяжелый зонтик с синей ручкой, совершенно не нужный нормальному человеку в феврале.

        (Пелевин — Любовь к трём цукербринам")
  • +21
    (no politics intended)
    Для интересующихся об что этот пост

    описание ошибки — gist.github.com/klaufir/d1e694c064322a7fbc15
    видео с теорией заговора — www.youtube.com/watch?v=RMgIpC-bCfQ
  • +10
    Караул, а если добавить ещё Leap second ;)
    • 0
      Первая секунда координации была добавлена в 1972 году, на нашу константу это не влияет.
      • 0
        Вы правы!
  • –48
    За информацию спасибо, но, думаю, тут все были бы благодарны вам, если бы вы убрали упоминания о международных конфликтах из текста и заголовка.
    • +13
      Тогда придется добавить « Ш О К , Ф О Т О » :-) А по факту: это хороший урок про последствия любых действий, magic numbers и расчетов на коленке.
  • +17
    Think different — подумали в Аппле, крутанули рулетку и назначили начало эпохи на 1904 год.
    • +2
      У них там какие-то проблемы были из-за того. что 1900-й — не високосный (хотя должен, но есть специальные исключения), поэтому начали с 1904.
      • +6
        Хм, что в Apple не осилили что год кратный 100 и не кратный 400 не является високосным?
        • +26
          Писали на хакатоне ;-). А мы все знаем, как пишут на хакатоне:
          return {1, 1, 2, 3, 5, 8, 13, 21 /* LOL enough for demo */ }
    • +1
      В первом Apple II было 4 килобайта памяти, и экономили на каждой инструкции.
  • +4
    НТВ ru новости
    www.youtube.com/watch?v=XMCDOyYQfp0&list=PLSgy-gJ-dkS-k8Rj9hqFRjIZTrnPj2Tpi

    Дата: Published on Jul 20, 2014

    Скачиваем mp4:

    cclive -s medium_mp4_i18_360p www.youtube.com/watch?v=XMCDOyYQfp0&list=PLSgy-gJ-dkS-k8Rj9hqFRjIZTrnPj2Tpi

    Определяем дату:

    ffmpeg -i Сегодня\ 20\ июля\ 2014\ года\ 1900.mp4

    Результат:

    Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'Сегодня 20 июля 2014 года 1900.mp4':
    Metadata:
    major_brand: mp42
    minor_version: 0
    compatible_brands: isommp42
    creation_time: 2014-07-19 23:53:11
    Duration: 00:42:42.04, start: 0.000000, bitrate: 491 kb/s
    Stream #0:0(und): Video: h264 (Constrained Baseline) (avc1 / 0x31637661), yuv420p, 640x360 [SAR 1:1 DAR 16:9], 393 kb/s, 25 fps, 25 tbr, 25 tbn, 50 tbc (default)
    Metadata:
    handler_name: VideoHandler
    Stream #0:1(und): Audio: aac (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 96 kb/s (default)
    Metadata:
    creation_time: 2014-07-19 23:53:19
    handler_name: IsoMedia File Produced by Google, 5-11-2011
    • 0
      И что. создали под конец суток 19 числа, залили 20 (published). Что мы должны увидеть?
      • +4
        Создали не под конец суток 19-го, а создали (и залили) под конец 20. Дата же создания (в метаданных) на сутки меньше (конец 19-го), что полностью вытекает из статьи.
        • 0
          Хорошо, спасибо, вникнул, теперь понимаю разницу.
  • +2
    Очень интересная статья с феерической концовкой. Прямо детектив…
  • +4
    Не обращаясь к политической составляющей того ролика, словить лулз можно было уже из фразы блоггера-разоблачителя о том, что «поменять это значение в инфе о файле вообще никак нельзя». Опять же, не вдаваясь в подробности сказанного в ролике, просто подумал, что на том компе, где муксился файл, были сбиты часы. Теперь же всё встало на свои места, есть смысл иметь в виду такое объяснение.
  • +1
    Тогда, возможно, стоит пересмотреть свою точку зрения на достоверность старых роликов, которые используются в качестве доказательств. Если там стоит «правильная» дата, то, с учетом использованного оборудования и ПО, можно судить о подделке (т.е. запись сделана на 1 сутки позже события).
    • +1
      Не факт, т. к. в статье указано, что те, кто использовал не референсные исходники из стандарта, а писал свои и правильно подсчитал константу, выводят правильные данные.

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.