обратный инжиниринг видео кодеков без потерь (видео слой формата фотошоп) - PullRequest
0 голосов
/ 17 декабря 2018

Я реализую декодирование файлов Photoshop (PSD).У них есть формат, в основном документированный, но не все.В новых версиях фотошопа вы можете иметь видео слои.А данные видеослоя хранятся в теге «PxSD» (содержимое не задокументировано).Мне удалось перепроектировать некоторые метаданные с помощью следующего кода:

            case "PxSD": {
                // Raw data for 3D or video layers.
                var length = stream.readUint64();

                var layer_id = stream.readUint32(); // id of video layer

                var unknown1 = stream.readUint32(); // = 2
                var unknown2 = stream.readUint32(); // = 2

                var size = stream.readUint64(); // remaining size

                var numFrames = stream.readUint32();

                for (var nframe = 0; nframe < numFrames; ++nframe)
                {
                    var size2 = stream.readUint64();
                    var absFrame = stream.readUint32();
                    var layerTop = stream.readUint32();
                    var layerLeft = stream.readUint32();

                    // TODO: mode, 1 for grayscale image, 3 = RGB image
                    // They are always same?
                    var mode = stream.readUint32();
                    var mode2 = stream.readUint32();

                    // TODO: numChannels
                    // 4 if painting on a frame from blank video layer
                    // 6 if painting on top of an imported RGB video
                    var channels = 4;

                    for (var ch = 0; ch < channels; ++ch)
                    {
                        var depth = stream.readUint32();    // 8
                        var top = stream.readInt32();     // layer dimensions
                        var left = stream.readInt32();
                        var bottom = stream.readInt32();
                        var right = stream.readInt32();

                        var unknown3 = stream.readUint32();
                        let sz = stream.readUint32();

                        var dt = new Uint8Array(sz);
                        stream.readUint8Array(dt);
                        console.log(dt);
                    }
                }
                break;
            }

Несколько примеров содержимого фактических сжатых данных

ширина: 1, высота: 1 - полностьючерный (0) канал

[0, 3, 72, 137, 250, 15, 16, 96, 0, 1, 0, 1, 0, 0, 0, 0] (длина =16)

ширина: 1, высота: 1 - полностью белый (255) канал

[0, 3, 72, 137, 98, 0, 8, 48, 0, 0, 1, 0, 1, 0, 0, 0] (длина = 16)

ширина: 96, высота: 8 - полностью черный (0) канал

[0, 3, 72, 137, 250, 207, 64, 91, 240, 127, 212, 252, 81, 243, 7, 177, 249, 0, 1, 6, 0, 118, 67, 7, 249, 0, 0, 0]

ширина: 96, высота: 8 - полностью белый (255) канал

[0, 3, 72,137, 98, 96, 24, 5, 163, 96, 228, 2, 128, 0, 3, 0, 3, 0, 0, 1]

ширина: 96, высота: 7- полностью черный (0) канал

[0, 3, 72, 137, 250, 207, 64, 91, 240, 127, 212, 252, 81, 243, 41, 0, 01, 6, 0,120, 182, 6, 250]

У кого-нибудь есть мысли о том, какой тип сжатия используется?(это, безусловно, без потерь) (они используют макроблоки, какой-то JPEG без потерь? Это просто zlib?) Кто-нибудь указывает мне правильное направление?как это выглядит?Идеи?

Спасибо

1 Ответ

0 голосов
/ 17 декабря 2018

Хорошо, похоже, что первые 2 байта в данных - это сжатие

0=uncompressed
1=RLE
2=ZLIB
3=ZLIB with prediction

Тщательно еще не проверено

...