Tech と Culture

テクノロジーとカルチャー

ffmpeg 出力 motionJPEG フォーマット

motionJPEG と言う規格は存在しません。実際にどのようなデータになっているのか調べてみました。
ffmpegの出力した mjpeg ファイルに対して、 od -x ****.mjpeg として表示させてみました(INTELプロセッサ上)。


0000000 d8ff feff 0e00 614c 6376 3235 312e 2e31        FFD8(SOI)で開始。 FFFE コメント
0000020 0030 dbff 4300 0800 0404 0404 0504 0505       FFDB(DQT)量子化テーブル開始
0000040 0505 0605 0606 0606 0606 0606 0606 0606
0000060 0707 0807 0808 0707 0607 0706 0807 0808
0000100 0908 0909 0808 0808 0909 0a0a 0c0a 0b0c
0000120 0e0b 0e0e 1111 ff14 01c4 00a2 0100 0105      FFC4(DHT) ハフマンテーブル開始
0000140 0101 0101 0001 0000 0000 0000 0100 0302
0000160 0504 0706 0908 0b0a 0001 0103 0101 0101
0000200 0101 0101 0000 0000 0000 0201 0403 0605
0000220 0807 0a09 100b 0200 0301 0203 0304 0505
0000240 0404 0000 7d01 0201 0003 1104 1205 3121
0000260 0641 5113 0761 7122 3214 9181 08a1 4223
0000300 c1b1 5215 f0d1 3324 7262 0982 160a 1817
0000320 1a19 2625 2827 2a29 3534 3736 3938 433a
0000340 4544 4746 4948 534a 5554 5756 5958 635a
0000360 6564 6766 6968 736a 7574 7776 7978 837a
0000400 8584 8786 8988 928a 9493 9695 9897 9a99
0000420 a3a2 a5a4 a7a6 a9a8 b2aa b4b3 b6b5 b8b7
0000440 bab9 c3c2 c5c4 c7c6 c9c8 d2ca d4d3 d6d5
0000460 d8d7 dad9 e2e1 e4e3 e6e5 e8e7 eae9 f2f1
0000500 f4f3 f6f5 f8f7 faf9 0011 0102 0402 0304
0000520 0704 0405 0004 0201 0077 0201 1103 0504
0000540 3121 1206 5141 6107 1371 3222 0881 4214
0000560 a191 c1b1 2309 5233 15f0 7262 0ad1 2416
0000600 e134 f125 1817 1a19 2726 2928 352a 3736
0000620 3938 433a 4544 4746 4948 534a 5554 5756
0000640 5958 635a 6564 6766 6968 736a 7574 7776
0000660 7978 827a 8483 8685 8887 8a89 9392 9594
0000700 9796 9998 a29a a4a3 a6a5 a8a7 aaa9 b3b2
0000720 b5b4 b7b6 b9b8 c2ba c4c3 c6c5 c8c7 cac9
0000740 d3d2 d5d4 d7d6 d9d8 e2da e4e3 e6e5 e8e7
0000760 eae9 f3f2 f5f4 f7f6 f9f8 fffa 00c0 0811
0001000 9000 b000 0103 0022 1202 0300 0012 daff     FFDA(SOS)スキャンヘッダ
0001020 0c00 0103 0200 0311 0011 003f d946 b32b
0001040 5499 9e13 0815 bc1e 7000 6806 7d42 d27b

......................
(ハフマンデータが続く)
......................

0022040 00a2 00ff 8fa9 848e feb0 7f5c 4521 6ba1
0022060 fec5 fc7d a3c3 44d3 cfdf f351 9a3d 550d
0022100 228b da66 c546 3e6e 10f3 2f3f 2393 34f0
0022120 0fb9 79f3 3d45 ea70 e447 3fc3 a9ca 8aee
0022140 2536 11c2 1dd3 913f 69ce ddf0 57c6 3409
0022160 4faa 6618 0338 caea 15c3 9551 dfd6 913b
0022200 1817 5bdb 413f 906a 75ed cbbd 1525 0081
0022220 e732 fe93 93af 00ff 717d bd51 5294 5d65
0022240 674b bdfd 3fa7 13f0 e9fc 5d92 2384 643e
0022260 5c99 fc13 f539 0b18 8ef9 5ab5 c46b 8261
0022300 2487 499e fec0 eb87 5691 32d7 4bb7 2a11
0022320 ef8a 84ae a6dd 8b52 a1e9 ba34 905d 46ce
0022340 e8d3 935c f4c1 a6c1 2b1b 5066 c715 f21c
0022360 0706 40e6 d4fa ce51 af91 1dca 0e4e b042
0022400 4828 a927 a752 eb07 d748 094e 132c fd07
0022420 fc9e 2cf7 a0df b9e7 e8a6 7fc1 fc4f e7c9
0022440 b67c cf41 b821 9ff9 d9ff d8ff feff 0e00 FFD9(EOI)エンドマーカ FFD8(SOI)スタートマーカ FFFE コメント
0022460 614c 6376 3235 312e 2e31 0030 dbff 4300
0022500 0800 0404 0404 0504 0505 0505 0605 0606
0022520 0606 0606 0606 0606 0606 0707 0807 0808
0022540 0707 0607 0706 0807 0808 0908 0909 0808
0022560 0808 0909 0a0a 0c0a 0b0c 0e0b 0e0e 1111
0022600 ff14 01c4 00a2 0100 0105 0101 0101 0001
0022620 0000 0000 0000 0100 0302 0504 0706 0908
0022640 0b0a 0001 0103 0101 0101 0101 0101 0000
0022660 0000 0000 0201 0403 0605 0807 0a09 100b
0022700 0200 0301 0203 0304 0505 0404 0000 7d01
0022720 0201 0003 1104 1205 3121 0641 5113 0761
0022740 7122 3214 9181 08a1 4223 c1b1 5215 f0d1
0022760 3324 7262 0982 160a 1817 1a19 2625 2827
0023000 2a29 3534 3736 3938 433a 4544 4746 4948

通常のJPEG規格はFFD8(SOI)で始まり、テーブル定義の後、スキャンデータが並び、FFD9(EOI)で終わります。
このmotionJPEGファイルは、FFD9に続けてすぐにFFD8が始まり、再びテーブル定義、スキャンデータと並んでいます。
要するに通常のJPEGファイルを隙間無く詰めてならべているようです。
各画像毎にテーブルが並びますが、ffmpegの出力するmotionJPEGファイルでは、全てに対して全く同じテーブルを使用しているようです。テーブル処理でも時間がかかりますので、今回設計するシステムは全て同じテーブルを使ったmotionJPEGのみ対応することにして、テーブル処理は最初の一度だけ行うことにします。


さて、これで必要な情報が大体揃ってきたので、いよいよハフマンデコーダのハードウェア設計に入ります。