Про Adobe DNG SDK

Вдогонку ко вчерашнему.

При рассмотрении потрохов DNG SDK (каковой, конечно же, используется в Adobe DNG Converter, другой вопрос что публичная версия могла несколько устареть) объяснение такому поведению EXIF нашлось:

  • Структура dng_exif - это разобранный (в кучу полей) EXIF
  • Пишется EXIF-таблица - из этой структуры.
  • Соответственно
    • Если поле (тег) неизвестно (ну вот OffsetTime), оно не разбирается.
    • Если поле не разобрано - оно не пишется.
    • Если тег известен, то он может разбираться в несколько полей dng_exif
    • Так, к примеру, работает dng_exif::SetExposureTime, заполняются два поля структуры
    • И они же потом и пишутся.
  • А интерфейса "вот тебе готовая таблица тегов EXIF, запиши ее пожалуйста, ничего там не трогая" в DNG SDK нет.
  • Мою характеристику проектировщика этого интерфейса я оставлю непроизнесенной.

Да, вот в результате как устроен код (кусок кода) программы dngconvert (взятой для примера):

getExifTag(exifData, "Exif.Photo.ComponentsConfiguration", 0, &m_Exif->fComponentsConfiguration);
getExifTag(exifData, "Exif.Photo.Contrast", 0, &m_Exif->fContrast);
getExifTag(exifData, "Exif.Photo.CustomRendered", 0, &m_Exif->fCustomRendered);
getExifTag(exifData, "Exif.Photo.DateTimeDigitized", &m_Exif->fDateTimeDigitized);
getExifTag(exifData, "Exif.Photo.DateTimeOriginal", &m_Exif->fDateTimeOriginal);
getExifTag(exifData, "Exif.Photo.DigitalZoomRatio", 0, &m_Exif->fDigitalZoomRatio);
getExifTag(exifData, "Exif.Photo.ExposureBiasValue", 0, &m_Exif->fExposureBiasValue);
getExifTag(exifData, "Exif.Photo.ExposureMode", 0, &m_Exif->fExposureMode);
getExifTag(exifData, "Exif.Photo.ExposureProgram", 0, &m_Exif->fExposureProgram);
getExifTag(exifData, "Exif.Photo.ExposureTime", 0, &m_Exif->fExposureTime);
getExifTag(exifData, "Exif.Photo.FileSource", 0, &m_Exif->fFileSource);
getExifTag(exifData, "Exif.Photo.Flash", 0, &m_Exif->fFlash);
getExifTag(exifData, "Exif.Photo.FNumber", 0, &m_Exif->fFNumber);
getExifTag(exifData, "Exif.Photo.FocalPlaneResolutionUnit", 0, &m_Exif->fFocalPlaneResolutionUnit);
getExifTag(exifData, "Exif.Photo.FocalPlaneXResolution", 0, &m_Exif->fFocalPlaneXResolution);
getExifTag(exifData, "Exif.Photo.FocalPlaneYResolution", 0, &m_Exif->fFocalPlaneYResolution);
getExifTag(exifData, "Exif.Photo.FocalLength", 0, &m_Exif->fFocalLength);
getExifTag(exifData, "Exif.Photo.FocalLengthIn35mmFilm", 0, &m_Exif->fFocalLengthIn35mmFilm);
getExifTag(exifData, "Exif.Photo.GainControl", 0, &m_Exif->fGainControl);
getExifTag(exifData, "Exif.Photo.ISOSpeedRatings", 0, &m_Exif->fISOSpeedRatings[0]);
getExifTag(exifData, "Exif.Photo.LightSource", 0, &m_Exif->fLightSource);

И это только маленький кусочек.

И вот так работает вся эта индустрия. Сначала в одной библиотеке (exiv2 в данном случае) исчисляют все теги. Потом в DNG SDK исчисляют все теги. Потом пользоваль этих библиотек сводит это говнище воедино.

И это еще ничего. Хуже когда теги нужно преобразовать. Ну вот под каждого вендора отдельно:

getExifTag(exifData, "Exif.Panasonic.LensType", &m_Exif->fLensName);
getExifTag(exifData, "Exif.Panasonic.LensSerialNumber", &m_Exif->fLensSerialNumber);
// Sony Makernotes
if (getExifTag(exifData, "Exif.Sony2.LensID", 0, &val))
{
   char lensType[256];
   snprintf(lensType, sizeof(lensType), "%i", val);
   m_Exif->fLensID.Set_ASCII(lensType);
}

И так - по всем вендорам и всем особенностям. А дальше происходит ужасное:

  • Вендор меняет формат makernotes. В новой камере или в новой прошивке для старой камеры.
  • Авторы exiv2 далеко не сразу подпирают разбор этой новой версии
  • Автор dngconvert ничего уже не подпирает потому что Latest commit 49b50d4 on Aug 24, 2011
  • И появляется вот такое странное, которое вроде есть, а смысл для новых камер - утерян

При том, что EXIF-таблицу КОНЕЧНО надо просто копировать из исходного RAW в результирующий EXIF не задумываясь о ее смысле (за исключением небольшого количества полей, важных для конкретного приложения), ибо не дело конвертора обдумывать неизвестные ему поля.

И аналогично с makernotes (хотя там есть нерешаемая идеологическая проблема)

Прямо вот хоть бери напильник и правь этот самый DNG SDK, но он, сука, писан индусами (и опять же - вместо записи таблицы, foreach (entry, exifTable) write_tag_не-думая-о-его-смысле() - каждый тег пишется отдельно) и в этой миске риса с карри не так просто всунуть свое.

P.S. На фоне этого безумия даже исходники dcraw смотрятся где-то даже прилично, ибо Коффин все делал компактности для (в ущерб читаемости, конечно).  Хотя это и про другое, в dcraw используются только нужные для работы метаданные.

Comments

При том, что много лет снимаю в DNG, я никогда не понимал идеи конвертировать нативные RAW'ы в DNG.

В случае DNG->DNG я тоже не понимаю (ну только если исходный - нежатый, место поэкономить).

А глобально есть два вменяемых аргумента
а) а вот когда все остальные форматы забудут - DNG еще будут помнить
б) для uncompressed - пожать, поэкономить место.

Ну и самый вменяемый:
в) у меня старый Lr/ACR/C1/DXO, они эту камеру не поддерживают, а в DNG-виде - жрут (хотя с C1 бывают /бывали?/ приколы, когда она native raw жрет, а конвертированный DNG кажет неверно)

И что, все цвета норм в DNG-виде? При томи что во всех этих софтах скрытые поправки, завязанные на модели камер?

C1 вот у Pentax'а вообще только PEF жрёт, а от DNG-прямо-из-камеры с ума сходит. Что-то показывает, но лучше бы нет.

Ну, возможность DNG→DNG мне даже в голову не приходила.

Мне эти аргументы вменяемыми не кажутся. Если в DNG полученного из CRW пересадить всю идентификацию (но не фотоданные, только идентификцию — номера моделей, производителя, прошивки, такое) от DNG полученного из NEF — оно будет правильно обрабатываться? В смысле, цвета не поплывут при конверсии адобовским же софтом?

>> цвета не поплывут при конверсии адобовским же софтом?

Хрен его знает. Городская легенда гласит, что Adobe учитывает make/model даже для DNG, хотя мне это несколько сомнительно т.к. тогда уплывали бы всякие обработанные DNG но с сохраненными make/model.

Глобально же есть варианты
а) Ничего такого особенного в vendor-specific метаданных нету, для обработки (конкретным софтом) они не нужны
б) есть, но представимо в виде DNG tags (и конкретный софт их обрабатывает) и пересажено верно
б2) то же самое, но сконвертировано неверно
в) метаданные непредставимы в виде DNG tags (ну, к примеру, выравнивание данных у PhaseOne, плюс цветовой профиль в виде LUT)

Но даже в случае в - можно в процессе конверсии что-то такое приложить и свести задачу к представимой в DNG.

Бывает что и данные (пиксели) непредставимы в DNG-виде, ну вот Sigma/Foveon Quattro.

Ну, приложить-то можно, но если новый софт будет понимаеть это старое приложенное, то и старый RAW он скорее всего понимать будет.
Т.е. я слабо верю в ситуацию «Древний DNG обрабатывается полностью корректно, включая заёбы старой камеры, а про фирменный формат от этой камеры забыли». Теоретически она возможна, а практически — что-то сомневаюсь. Или всё сдохнет или будут тянуть совместимость.

Одна польза от DNG может быть в архивном смысле — когда всё это забудут и ещё через 100 лет цифровые археологи будут раскапывать старые датацентры то по DNG накопается хотя бы PDF с ванильным форматом (не учитывающий никакие скрытые поправки, конечно) а по CRW не накопается ничего. Но нас это уже волновать не будет.

Я же вот в случае "в" написал вполне конкретное "выравнивание у PhaseOne".
Была (может и есть) куча софта (к примеру, RPP), которая выравнивать не умела, получались квадраты. А вот DNG-конвертор - выравнивал в процессе конверсии - и дальше все было ок. Естественно, при этом сами RAW-данные менялись.

Вполне возможно, что такое выравнивание (изменение данных) убивает какую-то маргинальную технику, ну скажем вычитание темнового кадра (коий нужно вычитать до выравнивания, либо при выравнивании использовать одинаковые коэффициенты).

Почему Sigma непредставима в DNG? Лично перегонял сигму (права меррилл, но кваттро по-моему тоже той софтинкой конвертится - X3F Wrapper) в DNG и оно даже работало в Adobe софте.

Потому что у нижних слоев разрешение вдвое ниже, DNG-тегами такого не выразить.

Но, конечно "непредставима без модификации исходных данных (пикселей)". Так то - пожалуйста, R/G интерполируют на удвоенное разрешение (и точки АФ замазывают) и вроде ок.

> В случае DNG->DNG я тоже не понимаю

частный случай же просто покоцать данные (например отключить принудительну коррекцию оптики в ACR/LR если firmware вписала тэги в родной DNG raw)

Z / V

exiftool спасает

А DNG Converter - не должен бы

да, но я про DNG -> DNG, а не про DNG converter (который так тэги не правит конечно же) - это же не единственное ПО которое делает DNG -> DNG (с какими-либо модификациями внутри)...

Z / V

Индусам как поэтам, платят построчно.

ну эти стихи про getExifTag - это из опенсорца.

Но DNG SDK, да, очень поэтически написан. Геттеры сеттеров погоняют.