00001 <?php
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032 $head_SOF_pos=0x9e;
00033
00034 function read_SOF() {
00035 global $sbuf,$pos,$SOI,$APP0,$DQT,$SOF,$DHT,$SOS;
00036
00037 $sof_tag= ord($sbuf[$pos])*256+ord($sbuf[$pos+1]);
00038 if ($sof_tag != 0xffc0) {
00039 printf ("wrong SOF tag 0x%04x (expected 0x%04x)\n",$sof_tag,0xffc0);
00040 exit(1);
00041 }
00042 $len=ord($sbuf[$pos+2])*256+ord($sbuf[$pos+3]);
00043 $SOF=substr($sbuf,$pos,$len+2);
00044 $pos+=(2+$len);
00045 printf ("SOF: len=0x%x\n",$len);
00046 }
00047
00048 function read_DHT() {
00049 global $sbuf,$pos,$SOI,$APP0,$DQT,$SOF,$DHT,$SOS;
00050 $DHT="";
00051 while (($dht_tag= ord($sbuf[$pos])*256+ord($sbuf[$pos+1]))==0xffc4) {
00052 $len=ord($sbuf[$pos+2])*256+ord($sbuf[$pos+3]);
00053 $DHT.=substr($sbuf,$pos,$len+2);
00054 $pos+=(2+$len);
00055 printf ("DHT: len=0x%x\n",$len);
00056 }
00057 }
00058 function read_SOS() {
00059 global $sbuf,$pos,$SOI,$APP0,$DQT,$SOF,$DHT,$SOS;
00060
00061 $sos_tag= ord($sbuf[$pos])*256+ord($sbuf[$pos+1]);
00062 if ($sos_tag != 0xffda) {
00063 printf ("wrong SOS tag 0x%04x (expected 0x%04x)\n",$sof_tag,0xffda);
00064 exit(1);
00065 }
00066 $len=ord($sbuf[$pos+2])*256+ord($sbuf[$pos+3]);
00067 $SOS=substr($sbuf,$pos,$len+2);
00068 $pos+=(2+$len);
00069 printf ("SOS len=0x%x\n",$len);
00070 }
00071
00072 function print_SOF() {
00073 global $SOF;
00074 $pos=4;
00075 $bits=ord($SOF[$pos++]);
00076 $height=256*ord($SOF[$pos++])+ord($SOF[$pos++]);
00077 $width= 256*ord($SOF[$pos++])+ord($SOF[$pos++]);
00078 $num_comp=ord($SOF[$pos++]);
00079 $comps=array();
00080 for ($i=0; $i<$num_comp; $i++) {
00081 $id= ord($SOF[$pos++]);
00082 $freq=ord($SOF[$pos++]);
00083 $qtab=ord($SOF[$pos++]);
00084 $comps[]=array("id"=>$id,"fh"=>$freq>>4,"fv"=>$freq & 0xf, "qtab"=>$qtab);
00085 }
00086 printf ("\nSOF:\n");
00087 printf (" bits= 0x%x\n",$bits);
00088 printf (" width= %d (0x%x)\n",$width,$width);
00089 printf (" height=%d (0x%x)\n",$height,$height);
00090 foreach ($comps as $entry) {
00091 printf(" id=%d, fh=%d, fv=%d, qtab=%d\n",$entry["id"], $entry["fh"], $entry["fv"], $entry["qtab"]);
00092 }
00093
00094 }
00095
00096 function print_SOS() {
00097 global $SOS;
00098 $pos=4;
00099 $num_comp=ord($SOS[$pos++]);
00100 $comps_sos=array();
00101 for ($i=0; $i<$num_comp; $i++) {
00102 $id= ord($SOS[$pos++]);
00103 $dht=ord($SOS[$pos++]);
00104 $comps_sos[]=array("id"=>$id,"dht_dc"=>$dht>>4,"dht_ac"=>$dht & 0xf);
00105 }
00106 printf ("\nSOS:\n");
00107 foreach ($comps_sos as $entry) {
00108 printf(" id=%d, dht_dc=%d, dht_ac=%d\n",$entry["id"], $entry["dht_dc"], $entry["dht_ac"]);
00109 }
00110
00111 }
00112
00113 function read_header() {
00114 global $sbuf,$pos,$head_SOF_pos;
00115 echo "<pre>\n";
00116 $jhfile=fopen("/dev/jpeghead","r+");
00117 $sbuf=fread($jhfile, 8192);
00118 fclose($jhfile);
00119 $pos=$head_SOF_pos;
00120 printf ("pos=0x%x\n",$pos);
00121 read_SOF();
00122 printf ("pos=0x%x\n",$pos);
00123 read_DHT();
00124 printf ("pos=0x%x\n",$pos);
00125 read_SOS();
00126 printf ("pos=0x%x\n",$pos);
00127 echo "</pre>\n";
00128 }
00129 function write_header() {
00130 global $sbuf;
00131 echo "<pre>\n";
00132 $jhfile=fopen("/dev/jpeghead","w+");
00133 $l=fwrite($jhfile, $sbuf);
00134 fclose($jhfile);
00135 printf ("Written %d (0x%x) bytes to /dev/jpeghead\n",strlen($sbuf),strlen($sbuf));
00136 echo "</pre>\n";
00137 }
00138
00139
00140 function show_header() {
00141 echo "<pre>\n";
00142 print_SOF();
00143 print_SOS();
00144 echo "</pre>\n";
00145 }
00146
00147
00148 function set_color6() {
00149 global $SOF_arr, $SOS_arr;
00150 $SOF_arr=array (
00151 array ("id"=>1, "fh"=>2, "fv"=>2,"qtab"=>0),
00152 array ("id"=>2, "fh"=>1, "fv"=>1,"qtab"=>1),
00153 array ("id"=>3, "fh"=>1, "fv"=>1,"qtab"=>1));
00154 $SOS_arr=array (
00155 array("id"=>1, "dht_dc"=>0, "dht_ac"=>0),
00156 array("id"=>2, "dht_dc"=>1, "dht_ac"=>1),
00157 array("id"=>3, "dht_dc"=>1, "dht_ac"=>1));
00158 }
00159
00160 function set_jp46dc() {
00161 global $SOF_arr, $SOS_arr;
00162 $SOF_arr=array (
00163 array ("id"=>1, "fh"=>1, "fv"=>1,"qtab"=>0),
00164 array ("id"=>2, "fh"=>1, "fv"=>1,"qtab"=>0),
00165 array ("id"=>3, "fh"=>1, "fv"=>1,"qtab"=>0),
00166 array ("id"=>4, "fh"=>1, "fv"=>1,"qtab"=>0),
00167 array ("id"=>5, "fh"=>1, "fv"=>1,"qtab"=>1),
00168 array ("id"=>6, "fh"=>1, "fv"=>1,"qtab"=>1));
00169 $SOS_arr=array (
00170 array("id"=>1, "dht_dc"=>0, "dht_ac"=>0),
00171 array("id"=>2, "dht_dc"=>0, "dht_ac"=>0),
00172 array("id"=>3, "dht_dc"=>0, "dht_ac"=>0),
00173 array("id"=>4, "dht_dc"=>0, "dht_ac"=>0),
00174 array("id"=>5, "dht_dc"=>1, "dht_ac"=>1),
00175 array("id"=>6, "dht_dc"=>1, "dht_ac"=>1));
00176 }
00177
00178
00179 function set_mono4() {
00180 global $SOF_arr, $SOS_arr;
00181 $SOF_arr=array (
00182 array ("id"=>1, "fh"=>2, "fv"=>2,"qtab"=>0));
00183 $SOS_arr=array (
00184 array("id"=>1, "dht_dc"=>0, "dht_ac"=>0));
00185 }
00186
00187 function set_jp4($bayer) {
00188 global $SOF_arr, $SOS_arr;
00189 $SOF_arr=array (
00190 array ("id"=>4+$bayer, "fh"=>2, "fv"=>2,"qtab"=>0));
00191 $SOS_arr=array (
00192 array("id"=>4+$bayer, "dht_dc"=>0, "dht_ac"=>0));
00193 }
00194
00195 function set_jp4dc($bayer) {
00196 global $SOF_arr, $SOS_arr;
00197 $SOF_arr=array (
00198 array ("id"=>4+(($bayer+0) & 3), "fh"=>1, "fv"=>1,"qtab"=>0),
00199 array ("id"=>4+(($bayer+1) & 3), "fh"=>1, "fv"=>1,"qtab"=>0),
00200 array ("id"=>4+(($bayer+2) & 3), "fh"=>1, "fv"=>1,"qtab"=>0),
00201 array ("id"=>4+(($bayer+3) & 3), "fh"=>1, "fv"=>1,"qtab"=>0));
00202 $SOS_arr=array (
00203 array("id"=>4+(($bayer+0) & 3), "dht_dc"=>0, "dht_ac"=>0),
00204 array("id"=>4+(($bayer+1) & 3), "dht_dc"=>0, "dht_ac"=>0),
00205 array("id"=>4+(($bayer+2) & 3), "dht_dc"=>0, "dht_ac"=>0),
00206 array("id"=>4+(($bayer+3) & 3), "dht_dc"=>0, "dht_ac"=>0));
00207 }
00208 function set_jp4diff($bayer) {
00209 global $SOF_arr, $SOS_arr;
00210 $SOF_arr=array (
00211 array ("id"=>4+(($bayer+0) & 3), "fh"=>1, "fv"=>1,"qtab"=>1),
00212 array ("id"=>4+(($bayer+1) & 3), "fh"=>1, "fv"=>1,"qtab"=>1),
00213 array ("id"=>4+(($bayer+2) & 3), "fh"=>1, "fv"=>1,"qtab"=>1),
00214 array ("id"=>4+(($bayer+3) & 3), "fh"=>1, "fv"=>1,"qtab"=>1));
00215 $SOS_arr=array (
00216 array("id"=>4+(($bayer+0) & 3), "dht_dc"=>1, "dht_ac"=>1),
00217 array("id"=>4+(($bayer+1) & 3), "dht_dc"=>1, "dht_ac"=>1),
00218 array("id"=>4+(($bayer+2) & 3), "dht_dc"=>1, "dht_ac"=>1),
00219 array("id"=>4+(($bayer+3) & 3), "dht_dc"=>1, "dht_ac"=>1));
00220 $SOF_arr[(4-$bayer) & 3]["qtab"]=0;
00221 $SOS_arr[(4-$bayer) & 3]["dht_dc"]=0;
00222 $SOS_arr[(4-$bayer) & 3]["dht_ac"]=0;
00223 }
00224 function set_jp4hdr($bayer) {
00225 global $SOF_arr, $SOS_arr;
00226 $SOF_arr=array (
00227 array ("id"=>4+(($bayer+0) & 3), "fh"=>1, "fv"=>1,"qtab"=>1),
00228 array ("id"=>4+(($bayer+1) & 3), "fh"=>1, "fv"=>1,"qtab"=>1),
00229 array ("id"=>4+(($bayer+2) & 3), "fh"=>1, "fv"=>1,"qtab"=>1),
00230 array ("id"=>4+(($bayer+3) & 3), "fh"=>1, "fv"=>1,"qtab"=>1));
00231 $SOS_arr=array (
00232 array("id"=>4+(($bayer+0) & 3), "dht_dc"=>1, "dht_ac"=>1),
00233 array("id"=>4+(($bayer+1) & 3), "dht_dc"=>1, "dht_ac"=>1),
00234 array("id"=>4+(($bayer+2) & 3), "dht_dc"=>1, "dht_ac"=>1),
00235 array("id"=>4+(($bayer+3) & 3), "dht_dc"=>1, "dht_ac"=>1));
00236 $SOF_arr[(4-$bayer) & 3]["qtab"]=0;
00237 $SOS_arr[(4-$bayer) & 3]["dht_dc"]=0;
00238 $SOS_arr[(4-$bayer) & 3]["dht_ac"]=0;
00239 $SOF_arr[(6-$bayer) & 3]["qtab"]= 0;
00240 $SOS_arr[(6-$bayer) & 3]["dht_dc"]=0;
00241 $SOS_arr[(6-$bayer) & 3]["dht_ac"]=0;
00242 }
00243
00244 function encode_SOF() {
00245 global $SOF_arr,$SOF;
00246 $SOF=substr($SOF,0,9);
00247 $SOF.=chr(count($SOF_arr));
00248 foreach ($SOF_arr as $entry) {
00249 $SOF.=chr($entry["id"]);
00250 $SOF.=chr(($entry["fh"]<<4) | ($entry["fv"] & 0x0f));
00251 $SOF.=chr($entry["qtab"]);
00252 }
00253 $SOF[3]=chr(strlen($SOF)-2);
00254 }
00255
00256 function encode_SOS() {
00257 global $SOS_arr,$SOS;
00258 $SOS=substr($SOS,0,4);
00259 $SOS.=chr(count($SOS_arr));
00260 foreach ($SOS_arr as $entry) {
00261 $SOS.=chr($entry["id"]);
00262 $SOS.=chr(($entry["dht_dc"]<<4) | ($entry["dht_ac"] & 0x0f));
00263 }
00264 $SOS.=chr(0).chr(0x3f).chr(0);
00265 $SOS[3]=chr(strlen($SOS)-2);
00266 }
00267
00268 function make_new() {
00269 global $sbuf,$pos,$SOI,$APP0,$DQT,$SOF,$DHT,$SOS,$SOF_arr,$SOS_arr,$head_SOF_pos;
00270 $sbuf=substr($sbuf,0,$head_SOF_pos);
00271 $sbuf.=$SOF.$DHT.$SOS;
00272 }
00273
00274
00275
00276
00277 switch ($_GET["shift"]) {
00278 case "1": $shift=1; break;
00279 case "2": $shift=2; break;
00280 case "3": $shift=3; break;
00281 case "0":
00282 default: $shift=0;
00283 }
00284
00285 echo "shift=".$shift;
00286 read_header();
00287 switch ($_GET["cmd"]) {
00288 case "jp4hdr": set_jp4hdr($shift); break;
00289 case "jp4diff": set_jp4diff($shift); break;
00290 case "jp4dc": set_jp4dc($shift); break;
00291
00292 case "jp4": set_jp4($shift); break;
00293 case "mono":
00294 case "mono4":
00295 set_mono4();
00296 break;
00297 case "jp46dc":
00298 set_jp46dc();
00299 break;
00300 case "jp46":
00301 case "mono6":
00302 case "color":
00303 set_color6();
00304 break;
00305 case "show":
00306 default:
00307 show_header();
00308 exit(0);
00309 }
00310
00311
00312 encode_SOF();
00313 encode_SOS();
00314 make_new();
00315 show_header();
00316 write_header();
00317 read_header();
00318 show_header();
00319 ?>