Anatoly Vorobey (avva) wrote,
Anatoly Vorobey
avva

Categories:

бритва хэнлона, временные метки и падение боинга

Это, наверное, первая запись в моем журнале с метками одновременно "программирование" и "политика".

Если вы следите за кризисом в Украине и в частности за падением малазийского "Боинга", то заметили, наверное, что украинское СБУ опубликовало запись переговоров сепаратистов вскоре после падения самолета. Видео была закачано на канал СБУ в Ютюбе всего через несколько часов после падения самолета. Люди заметили, что если скачать с Ютюба это видео, а потом посмотреть на видеофайл в какой-нибудь программе, которая показывает метаданные, то "дата создания" в файле оказывается 16-го июля, т.е. днем раньше собственно падения. Причем это не может быть разница в часовых поясах, потому что время почти на 24 часа раньше падения; отсюда люди заключили, что это доказательство того, что СБУ сделало фальшивые записи еще до катастрофы. Правда, другие люди вскоре заметили, что Ютюб поступает так с любым видео, которое в него загружают, и это видимо баг в Ютюбе. Так что теперь волнами по сети и оффлайновым СМИ расходятся разоблачение СБУ и разоблачение разоблачения.

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

- получить "время сейчас по юниксу";
- добавить разницу между временем по юниксу и временем по макинтошу - это некая константа;
- полученное "время сейчас по макинтошу" записать в файл mp4, который мы создаем.

Чему равна константа "разница между временем по юниксу и временем по макинтошу"? Она равна в точности числу секунд, прошедших между 1 января 1904 и 1 января 1970. Это 66 лет, из которых 17 были високосными (проверьте, если не доверяете мне). Всего дней получается: 66*365+17 = 24107, а секунд, учитывая 86400 секунд в сутках: 24107*86400 = 2082844800. Это правильное значение константы.

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

Как случилось, что создатели MPEG-4 неправильно посчитали разницу между двумя датами? Может, кто-то вручную считал високосные годы и ошибся? Не знаю. Так или иначе, неправильное значение из-за его присутствия в стандарте попало во множество библиотек для чтения и записи видеоформатов. Постепенно в последние годы правильное значение начинает его сменять; если вы поищете в гугле оба числа, то увидите несколько точных описаний проблемы в исходниках нескольких проектов: "стандарт предлагает использовать 2082758400, но правильное значение 2082844800". В других проектах правильное значение стоит просто потому, что они сами посчитали, исходя из определений эпох, а не пользовались исходниками из стандарта.

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

Все в этом мире взаимосвязано. Кривые руки авторов стандарта MPEG-4 приводят к конспиративным теориям в украинском конфликте. Так и живем.
Tags: политика, программирование, украина
Subscribe
  • Post a new comment

    Error

    default userpic

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 201 comments
Previous
← Ctrl ← Alt
Next
Ctrl → Alt →
Previous
← Ctrl ← Alt
Next
Ctrl → Alt →