packages/web/353/php_top/jhead.php

Go to the documentation of this file.
00001 <?php
00002 /*!*******************************************************************************
00003 *! FILE NAME  : jhead.php
00004 *! DESCRIPTION: different JFIF headers for JP4 variants (deviate from JFIF)
00005 *! Copyright (C) 2008 Elphel, Inc
00006 *! -----------------------------------------------------------------------------**
00007 *!
00008 *!  This program is free software: you can redistribute it and/or modify
00009 *!  it under the terms of the GNU General Public License as published by
00010 *!  the Free Software Foundation, either version 3 of the License, or
00011 *!  (at your option) any later version.
00012 *!
00013 *!  This program is distributed in the hope that it will be useful,
00014 *!  but WITHOUT ANY WARRANTY; without even the implied warranty of
00015 *!  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00016 *!  GNU General Public License for more details.
00017 *!
00018 *!  You should have received a copy of the GNU General Public License
00019 *!  along with this program.  If not, see <http://www.gnu.org/licenses/>.
00020 *! -----------------------------------------------------------------------------**
00021 *!  $Log: jhead.php,v $
00022 *!  Revision 1.1.1.1  2008/11/27 20:04:03  elphel
00023 *!
00024 *!
00025 *!  Revision 1.2  2008/05/18 02:25:13  elphel
00026 *!  changed color components numbers to facilitate JP4 flavors detection from SOF and SOS tags
00027 *!
00028 *!  Revision 1.1  2008/05/16 06:05:36  elphel
00029 *!  added script to modify JFIF headers (for JP4 experiments)
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 // var_dump($comps);
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 // var_dump($comps_sos);
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 // main
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 //echo "$SOF_arr"; var_dump($SOF_arr);
00311 //echo "$SOS_arr"; var_dump($SOS_arr);
00312  encode_SOF();
00313  encode_SOS();
00314  make_new();
00315  show_header();
00316  write_header();
00317  read_header();
00318  show_header();
00319 ?>

Generated on Fri Nov 28 00:06:24 2008 for elphel by  doxygen 1.5.1