逆向工程无损视频编解码器(photoshop格式视频层)

时间:2018-12-17 11:26:34

标签: reverse-engineering psd video-codecs

我正在实现解码photoshop(PSD)文件。它们具有大部分记录的格式,但不是全部。在较新版本的photoshop中,您可以具有视频层。视频层数据存储在“ 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,   0,1,6,0,120,182,6,250]

有人对使用哪种压缩有任何想法吗? (肯定是无损的)(他们使用宏块,某种无损的JPEG吗?仅仅是zlib吗?)有人指出我正确的方向吗?它是什么样子的?想法?

谢谢

1 个答案:

答案 0 :(得分:0)

好吧,似乎数据的前2个字节是压缩

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

尚未经过全面测试