Gosh I really shouldn't have gotten involved with zoneminder, it's just too fun and before I know it I've spent hours fiddling with hacking the camera and stuff. So I noticed when I did the "View Source" on google chrome it mentioned something about internet explorer 7 in the source code for the toshiba web interface. Well, I couldn't download IE7 on windows 10 to even try it out.
I went through the source appending each area onto the IP address and I found a few interesting things:
Code: Select all
NOTE: In the following location IPaddress/cgi-bin/viewer/getparam.cgi?system_hostname&videoin&network&system_info_language&system_info_customlanguage&capability_nmediastream&capability_ndo&capability_videoin_resolution&capability_image_iristype&status_do_i0&status_videomode_c0&eptz&status_vi&audioin_c0_mute&security_privilege&capability_videoin_resolution16x9&capability_videoin_resolution4x3&ircutcontrol_enableextled
system_hostname='Network Camera'
system_info_language_count='1'
system_info_language_i0='English'
system_info_language_i1=''
system_info_language_i2=''
system_info_language_i3=''
system_info_language_i4=''
system_info_language_i5=''
system_info_language_i6=''
system_info_language_i7=''
system_info_language_i8=''
system_info_language_i9=''
system_info_language_i10=''
system_info_language_i11=''
system_info_language_i12=''
system_info_language_i13=''
system_info_language_i14=''
system_info_language_i15=''
system_info_language_i16=''
system_info_language_i17=''
system_info_language_i18=''
system_info_language_i19=''
system_info_customlanguage_maxcount='1'
system_info_customlanguage_count='0'
system_info_customlanguage_i0=''
status_vi_i0='0'
status_vi_i1='0'
status_vi_i2='0'
status_do_i0='0'
network_http_port='80'
network_http_authmode='basic'
network_http_s0_accessname='video.mjpg'
network_http_s1_accessname='video2.mjpg'
network_http_s2_accessname='video3.mjpg'
network_http_s3_accessname='video4.mjpg'
network_http_s4_accessname='videoany.mjpg'
network_http_anonymousviewing='0'
network_https_port='443'
network_rtsp_port='554'
network_rtsp_anonymousviewing='0'
network_rtsp_authmode='disable'
network_rtsp_s0_accessname='live.sdp'
network_rtsp_s1_accessname='live2.sdp'
network_rtsp_s2_accessname='live3.sdp'
network_rtsp_s3_accessname='live4.sdp'
network_rtsp_s4_accessname='liveany.sdp'
network_sip_port='5060'
videoin_ptzstatus='2'
videoin_text=''
videoin_options='quality'
videoin_enablepreview='0'
videoin_c0_ptzstatus='2'
videoin_c0_text=''
videoin_c0_options='quality'
videoin_c0_enablepreview='0'
videoin_c0_crop_preview='0'
videoin_c0_crop_position='0,0'
videoin_c0_crop_size='1280x800'
videoin_c0_s0_codectype='h264'
videoin_c0_s0_resolution='1280x800'
videoin_c0_s0_mpeg4_maxframe='30'
videoin_c0_s0_h264_maxframe='30'
videoin_c0_s0_h264_profile='1'
videoin_c0_s0_mjpeg_maxframe='30'
videoin_c0_s1_codectype='h264'
videoin_c0_s1_resolution='640x400'
videoin_c0_s1_mpeg4_maxframe='30'
videoin_c0_s1_h264_maxframe='30'
videoin_c0_s1_h264_profile='1'
videoin_c0_s1_mjpeg_maxframe='30'
videoin_c0_s2_codectype='h264'
videoin_c0_s2_resolution='176x144'
videoin_c0_s2_mpeg4_maxframe='5'
videoin_c0_s2_h264_maxframe='5'
videoin_c0_s2_h264_profile='1'
videoin_c0_s2_mjpeg_maxframe='5'
videoin_c0_s3_codectype='h264'
videoin_c0_s3_resolution='1280x800'
videoin_c0_s3_mpeg4_maxframe='30'
videoin_c0_s3_h264_maxframe='30'
videoin_c0_s3_h264_profile='1'
videoin_c0_s3_mjpeg_maxframe='30'
videoin_c0_s4_codectype='h264'
videoin_c0_s4_resolution='1280x800'
videoin_c0_s4_mpeg4_maxframe='30'
videoin_c0_s4_h264_maxframe='30'
videoin_c0_s4_h264_profile='1'
videoin_c0_s4_mjpeg_maxframe='30'
security_privilege_do='operator'
security_privilege_camctrl='view'
capability_ndo='0'
capability_nmediastream='4'
capability_videoin_resolution='176x144,320x200,640x400,1280x800'
capability_videoin_resolution4x3='176x144,320x240,640x480,800x600,1024x768'
eptz_c0_osdzoom='0'
eptz_c0_smooth='1'
eptz_c0_panspeed='0'
eptz_c0_tiltspeed='0'
eptz_c0_zoomspeed='0'
eptz_c0_autospeed='1'
eptz_c0_s0_patrolseq=''
eptz_c0_s0_patroldwelling=''
eptz_c0_s0_preset_i0_name=''
eptz_c0_s0_preset_i0_pos=''
eptz_c0_s0_preset_i0_size=''
eptz_c0_s0_preset_i1_name=''
eptz_c0_s0_preset_i1_pos=''
eptz_c0_s0_preset_i1_size=''
eptz_c0_s0_preset_i2_name=''
eptz_c0_s0_preset_i2_pos=''
eptz_c0_s0_preset_i2_size=''
eptz_c0_s0_preset_i3_name=''
eptz_c0_s0_preset_i3_pos=''
eptz_c0_s0_preset_i3_size=''
eptz_c0_s0_preset_i4_name=''
eptz_c0_s0_preset_i4_pos=''
eptz_c0_s0_preset_i4_size=''
eptz_c0_s0_preset_i5_name=''
eptz_c0_s0_preset_i5_pos=''
eptz_c0_s0_preset_i5_size=''
eptz_c0_s0_preset_i6_name=''
eptz_c0_s0_preset_i6_pos=''
eptz_c0_s0_preset_i6_size=''
eptz_c0_s0_preset_i7_name=''
eptz_c0_s0_preset_i7_pos=''
eptz_c0_s0_preset_i7_size=''
eptz_c0_s0_preset_i8_name=''
eptz_c0_s0_preset_i8_pos=''
eptz_c0_s0_preset_i8_size=''
eptz_c0_s0_preset_i9_name=''
eptz_c0_s0_preset_i9_pos=''
eptz_c0_s0_preset_i9_size=''
eptz_c0_s0_preset_i10_name=''
eptz_c0_s0_preset_i10_pos=''
eptz_c0_s0_preset_i10_size=''
eptz_c0_s0_preset_i11_name=''
eptz_c0_s0_preset_i11_pos=''
eptz_c0_s0_preset_i11_size=''
eptz_c0_s0_preset_i12_name=''
eptz_c0_s0_preset_i12_pos=''
eptz_c0_s0_preset_i12_size=''
eptz_c0_s0_preset_i13_name=''
eptz_c0_s0_preset_i13_pos=''
eptz_c0_s0_preset_i13_size=''
eptz_c0_s0_preset_i14_name=''
eptz_c0_s0_preset_i14_pos=''
eptz_c0_s0_preset_i14_size=''
eptz_c0_s0_preset_i15_name=''
eptz_c0_s0_preset_i15_pos=''
eptz_c0_s0_preset_i15_size=''
eptz_c0_s0_preset_i16_name=''
eptz_c0_s0_preset_i16_pos=''
eptz_c0_s0_preset_i16_size=''
eptz_c0_s0_preset_i17_name=''
eptz_c0_s0_preset_i17_pos=''
eptz_c0_s0_preset_i17_size=''
eptz_c0_s0_preset_i18_name=''
eptz_c0_s0_preset_i18_pos=''
eptz_c0_s0_preset_i18_size=''
eptz_c0_s0_preset_i19_name=''
eptz_c0_s0_preset_i19_pos=''
eptz_c0_s0_preset_i19_size=''
eptz_c0_s1_patrolseq=''
eptz_c0_s1_patroldwelling=''
eptz_c0_s1_preset_i0_name=''
eptz_c0_s1_preset_i0_pos=''
eptz_c0_s1_preset_i0_size=''
eptz_c0_s1_preset_i1_name=''
eptz_c0_s1_preset_i1_pos=''
eptz_c0_s1_preset_i1_size=''
eptz_c0_s1_preset_i2_name=''
eptz_c0_s1_preset_i2_pos=''
eptz_c0_s1_preset_i2_size=''
eptz_c0_s1_preset_i3_name=''
eptz_c0_s1_preset_i3_pos=''
eptz_c0_s1_preset_i3_size=''
eptz_c0_s1_preset_i4_name=''
eptz_c0_s1_preset_i4_pos=''
eptz_c0_s1_preset_i4_size=''
eptz_c0_s1_preset_i5_name=''
eptz_c0_s1_preset_i5_pos=''
eptz_c0_s1_preset_i5_size=''
eptz_c0_s1_preset_i6_name=''
eptz_c0_s1_preset_i6_pos=''
eptz_c0_s1_preset_i6_size=''
eptz_c0_s1_preset_i7_name=''
eptz_c0_s1_preset_i7_pos=''
eptz_c0_s1_preset_i7_size=''
eptz_c0_s1_preset_i8_name=''
eptz_c0_s1_preset_i8_pos=''
eptz_c0_s1_preset_i8_size=''
eptz_c0_s1_preset_i9_name=''
eptz_c0_s1_preset_i9_pos=''
eptz_c0_s1_preset_i9_size=''
eptz_c0_s1_preset_i10_name=''
eptz_c0_s1_preset_i10_pos=''
eptz_c0_s1_preset_i10_size=''
eptz_c0_s1_preset_i11_name=''
eptz_c0_s1_preset_i11_pos=''
eptz_c0_s1_preset_i11_size=''
eptz_c0_s1_preset_i12_name=''
eptz_c0_s1_preset_i12_pos=''
eptz_c0_s1_preset_i12_size=''
eptz_c0_s1_preset_i13_name=''
eptz_c0_s1_preset_i13_pos=''
eptz_c0_s1_preset_i13_size=''
eptz_c0_s1_preset_i14_name=''
eptz_c0_s1_preset_i14_pos=''
eptz_c0_s1_preset_i14_size=''
eptz_c0_s1_preset_i15_name=''
eptz_c0_s1_preset_i15_pos=''
eptz_c0_s1_preset_i15_size=''
eptz_c0_s1_preset_i16_name=''
eptz_c0_s1_preset_i16_pos=''
eptz_c0_s1_preset_i16_size=''
eptz_c0_s1_preset_i17_name=''
eptz_c0_s1_preset_i17_pos=''
eptz_c0_s1_preset_i17_size=''
eptz_c0_s1_preset_i18_name=''
eptz_c0_s1_preset_i18_pos=''
eptz_c0_s1_preset_i18_size=''
eptz_c0_s1_preset_i19_name=''
eptz_c0_s1_preset_i19_pos=''
eptz_c0_s1_preset_i19_size=''
eptz_c0_s2_patrolseq=''
eptz_c0_s2_patroldwelling=''
eptz_c0_s2_preset_i0_name=''
eptz_c0_s2_preset_i0_pos=''
eptz_c0_s2_preset_i0_size=''
eptz_c0_s2_preset_i1_name=''
eptz_c0_s2_preset_i1_pos=''
eptz_c0_s2_preset_i1_size=''
eptz_c0_s2_preset_i2_name=''
eptz_c0_s2_preset_i2_pos=''
eptz_c0_s2_preset_i2_size=''
eptz_c0_s2_preset_i3_name=''
eptz_c0_s2_preset_i3_pos=''
eptz_c0_s2_preset_i3_size=''
eptz_c0_s2_preset_i4_name=''
eptz_c0_s2_preset_i4_pos=''
eptz_c0_s2_preset_i4_size=''
eptz_c0_s2_preset_i5_name=''
eptz_c0_s2_preset_i5_pos=''
eptz_c0_s2_preset_i5_size=''
eptz_c0_s2_preset_i6_name=''
eptz_c0_s2_preset_i6_pos=''
eptz_c0_s2_preset_i6_size=''
eptz_c0_s2_preset_i7_name=''
eptz_c0_s2_preset_i7_pos=''
eptz_c0_s2_preset_i7_size=''
eptz_c0_s2_preset_i8_name=''
eptz_c0_s2_preset_i8_pos=''
eptz_c0_s2_preset_i8_size=''
eptz_c0_s2_preset_i9_name=''
eptz_c0_s2_preset_i9_pos=''
eptz_c0_s2_preset_i9_size=''
eptz_c0_s2_preset_i10_name=''
eptz_c0_s2_preset_i10_pos=''
eptz_c0_s2_preset_i10_size=''
eptz_c0_s2_preset_i11_name=''
eptz_c0_s2_preset_i11_pos=''
eptz_c0_s2_preset_i11_size=''
eptz_c0_s2_preset_i12_name=''
eptz_c0_s2_preset_i12_pos=''
eptz_c0_s2_preset_i12_size=''
eptz_c0_s2_preset_i13_name=''
eptz_c0_s2_preset_i13_pos=''
eptz_c0_s2_preset_i13_size=''
eptz_c0_s2_preset_i14_name=''
eptz_c0_s2_preset_i14_pos=''
eptz_c0_s2_preset_i14_size=''
eptz_c0_s2_preset_i15_name=''
eptz_c0_s2_preset_i15_pos=''
eptz_c0_s2_preset_i15_size=''
eptz_c0_s2_preset_i16_name=''
eptz_c0_s2_preset_i16_pos=''
eptz_c0_s2_preset_i16_size=''
eptz_c0_s2_preset_i17_name=''
eptz_c0_s2_preset_i17_pos=''
eptz_c0_s2_preset_i17_size=''
eptz_c0_s2_preset_i18_name=''
eptz_c0_s2_preset_i18_pos=''
eptz_c0_s2_preset_i18_size=''
eptz_c0_s2_preset_i19_name=''
eptz_c0_s2_preset_i19_pos=''
eptz_c0_s2_preset_i19_size=''
If you go down to videoin you can see that different sources have different resolutions and this should help solve any bandwidth issues. We can see different ports for RTSP and HTTP, it should be everything needed to get it set up to a resolution we want except I don't know about changing the frame rates even still.
Go here: /include/eptz.js and you see:
Code: Select all
var FULLVIEW_STREAM_INDEX = 3; //4th stream
var roi_c0_s3_size; //for DM365
var TRUEWIDTH,TRUEHEIGHT;
var BOXWIDTH, BOXHEIGHT;
var SNWIDTH, SNHEIGHT;
var MOBILE_WIDTH = 176, MOBILE_HEIGHT = 144;
var RATIO_X, RATIO_Y;
var JcropObj = null;
var VIDEO_JPG; //="/cgi-bin/viewer/video.jpg?streamid=2&resolution=400x300&quality=5";
var g_bSmooth = false;
// Interval for refreshImage()
var INTERVAL_snapshot=1000;
var INTERVAL_ROI=5000;
$.ajaxSetup({ async: false });
$.getJSON("/cgi-bin/viewer/getparam.cgi?videoin_c0_crop_size&capability_videoin_resolution16x9&capability_videoin_resolution4x3&capability_videoin_resolution")
var CPATURE_SIZE = videoin_c0_crop_size;
var CAPTURE_WIDTH = CPATURE_SIZE.split("x")[0];
var CAPTURE_HEIGHT = CPATURE_SIZE.split("x")[1];
var aResolutionTbl = capability_videoin_resolution.split(',').reverse();
var aResolutionTbl_4x3 = capability_videoin_resolution4x3.split(',').reverse();
function initEPTZParams(type)
{
if (type == "global_view")
{
if (CAPTURE_WIDTH*3 == CAPTURE_HEIGHT*4)
{
SNWIDTH=BOXWIDTH = 160;
SNHEIGHT=BOXHEIGHT = 120;
}
else
{
SNWIDTH=BOXWIDTH = 160;
SNHEIGHT=BOXHEIGHT = 100;
}
}
else //cropping_setting & viewing_window
{
//in order to let RATIO_X00x1200 mapping to 400x300 correctly, we use 400x300(RATIO_X=4) rather than 320x240(RATIO_X=5)
//Max cap size is 2560x1920
if (CAPTURE_WIDTH*3 == CAPTURE_HEIGHT*4)
{
SNWIDTH=BOXWIDTH = 400;
SNHEIGHT=BOXHEIGHT = 300;
}
else
{
SNWIDTH=BOXWIDTH = 400;
SNHEIGHT=BOXHEIGHT = 250;
}
}
if ((type == "cropping_setting") || (type == "exposure_window")) //cropping setting always use fullsize
{
TRUEWIDTH = CAPTURE_WIDTH;
TRUEHEIGHT = CAPTURE_HEIGHT;
}
else
{
TRUEWIDTH = CAPTURE_WIDTH;
TRUEHEIGHT = CAPTURE_HEIGHT;
/*
if (videoin_c0_options == "framerate")
{
TRUEWIDTH = 800;
TRUEHEIGHT = 600;
}
else if (videoin_c0_options == "quality")
{
TRUEWIDTH = CAPTURE_WIDTH;
TRUEHEIGHT = CAPTURE_HEIGHT;
}
else if (videoin_c0_options == "crop") //normalize BOXWIDTH & BOXHEIGHT to fit the window
{
TRUEWIDTH=videoin_c0_crop_size.split('x')[0];
TRUEHEIGHT=videoin_c0_crop_size.split('x')[1];
if (BOXWIDTH * TRUEHEIGHT <= BOXHEIGHT * TRUEWIDTH)
{
SNHEIGHT=BOXHEIGHT=parseInt(BOXWIDTH * TRUEHEIGHT / TRUEWIDTH);
//TI DM365 platform limitation, width&height should >= 64
if (SNHEIGHT <= 64)
{
SNHEIGHT=64;
SNWIDTH=parseInt(BOXHEIGHT * TRUEWIDTH / TRUEHEIGHT);
}
}
else
{
BOXWIDTH=parseInt(BOXHEIGHT * TRUEWIDTH / TRUEHEIGHT);
if (type == "viewing_window") //cropping setting always use fullsize
{
SNWIDTH = 400
SNHEIGHT=parseInt(SNWIDTH * TRUEHEIGHT / TRUEWIDTH);
}
else
{
SNWIDTH=160;
SNHEIGHT=parseInt(SNWIDTH * TRUEHEIGHT / TRUEWIDTH);
}
}
}
*/
}
VIDEO_JPG="/cgi-bin/viewer/video.jpg?streamid=3&resolution="+ SNWIDTH +"x"+ SNHEIGHT +"&quality=5";
RATIO_X = TRUEWIDTH/BOXWIDTH;
RATIO_Y = TRUEHEIGHT/BOXHEIGHT;
roi_c0_s3_size = TRUEWIDTH + "x" + TRUEHEIGHT;
}
var bImgLoaded = true;
function refreshImage(video_jpg)
{
//Ensure GV show image in the order of timestamp
if (bImgLoaded == false) return;
var img = new Image();
var date = new Date();
img.onload = function(){
bImgLoaded = true;
$('.jcrop-hline:eq(0)').prev().attr('src', img.src);
$("#cropbox").attr('src', img.src);
//Log("Snapshot completed on : %s",date);
imgComplete();
};
img.onerror = function(){ imgComplete(); };
img.onabort = function(){ imgComplete(); };
imgComplete = function(){
img.onload=null;
img.onerror=null;
img.onabort = null;
img = null; //add this line to prevent memory leak?
bImgLoaded = true;
//Log("Snapshot completed on : %s",date);
};
img.src = video_jpg + "&date=" + date;
bImgLoaded = false;
}
function ePTZControl(movetype, param)
{
if(JcropObj && g_bSmooth) //used in Index.html
{
g_bPreventResend = false;
var coordsData;
var panspeed = (parseInt($("#camctrl_c0_panspeed").val()) + 6)*RATIO_X;
var tiltspeed = (parseInt($("#camctrl_c0_tiltspeed").val()) + 6)*RATIO_X;
var zoomspeed = 1.05 + (parseInt($("#camctrl_c0_zoomspeed").val()) + 6)*0.05; // -5 ~ +5 : 1.05 ~ 1.55
var now_coords = JcropObj.tellSelect();
now_x = now_coords.x;
now_y = now_coords.y;
now_w = now_coords.w;
now_h = now_coords.h;
if (movetype == "move")
{
switch( param)
{
case "up":
correct_y = parseInt(now_y - tiltspeed);
if (correct_y <= 0 ) correct_y = 0;
coordsData = "x=" + now_x + "&y=" + correct_y + "&w=" + now_w + "&h=" + now_h;
break;
case "down":
correct_y = parseInt(now_y + tiltspeed);
if ((correct_y + now_h) >= CAPTURE_HEIGHT) correct_y = CAPTURE_HEIGHT - now_h;
coordsData = "x=" + now_x + "&y=" + correct_y + "&w=" + now_w + "&h=" + now_h;
break;
case "left":
correct_x = parseInt(now_x - panspeed);
if (correct_x <= 0 ) correct_x = 0;
coordsData = "x=" + correct_x + "&y=" + now_y + "&w=" + now_w + "&h=" + now_h;
break;
case "right":
correct_x = parseInt(now_x + panspeed);
if ((correct_x + now_w) >= CAPTURE_WIDTH) correct_x = CAPTURE_WIDTH - now_w;
coordsData = "x=" + correct_x + "&y=" + now_y + "&w=" + now_w + "&h=" + now_h;
break;
case "home":
coordsData = "x=" + ROI_X + "&y=" + ROI_Y + "&w=" + ROI_W + "&h=" + ROI_H;
break;
}
}
else if(movetype == 'zoom')
{
switch (param)
{
case "wide":
coordsData = "x=" + parseInt(now_x - now_w*(zoomspeed-1)/2) +
"&y=" + parseInt(now_y - now_h*(zoomspeed-1)/2) +
"&w=" + parseInt(now_w * zoomspeed) +
"&h=" + parseInt(now_h * zoomspeed);
break;
case "tele":
if (dZoomRatio >= 4) { return; } //At most 4X digital-zoom
coordsData = "x=" + parseInt(now_x + now_w*(zoomspeed-1)/2) +
"&y=" + parseInt(now_y + now_h*(zoomspeed-1)/2) +
"&w=" + parseInt(now_w / zoomspeed) +
"&h=" + parseInt(now_h / zoomspeed);
dZoomRatio = VideoSize.split('x')[0] / parseInt(now_w / zoomspeed);
if (dZoomRatio >= 4) //limit to 4X digital-zoom
{
g_bSmooth = false;
ePTZControl("zoom","tele");
g_bSmooth = true;
return;
}
break;
}
}
else if (movetype == "auto")
{
var CGICmd='/cgi-bin/camctrl/eCamCtrl.cgi?stream=' + streamsource + '&auto=' + param;
parent.retframe.location.href=CGICmd;
Log("Send: %s", CGICmd);
return;
}
Log("Smooth moving to %s", coordsData);
g_bRefreshROI = false; //add this to force smooth moving work
parseCoords(coordsData.replace(/&/g,",")); //coordsData example=> x=170&y=80&w=640&h=480
}
else //non-Smooth
{
g_bPreventResend = true;
CGICmd='/cgi-bin/camctrl/eCamCtrl.cgi?stream=' + streamsource + '&' + movetype + '=' + param;
Log("SEND: %s",CGICmd);
$.ajax({
url: CGICmd,
cache: false,
async: true,
success: function(data){
Log("Return value from ePTZ.cgi => %s",data);
if (JcropObj && movetype != 'auto')
{
g_bRefreshROI = false; //add this to execute JcropObj.setSelect rather than JcropObj.animateTo
parseCoords(data);
}
DisplayZoomRatio(data);
}
});
}
}
var dZoomRatio = 1;
function DisplayZoomRatio(data)
{
var coords = data.split(',');
NewVideoSize_W = parseInt(coords[2].split('=')[1]);
dZoomRatio = VideoSize.split('x')[0] / NewVideoSize_W;
Log("dZoomRatio = %f", dZoomRatio);
//if (eptz_c0_osdzoom == 0) return;
if(typeof(PLUGIN_ID) != "undefined" && eptz_c0_osdzoom == 1) // for IE
{
//PLUGIN_ID.DisplayStringOnVideo param
zoomText = "x" + dZoomRatio.toFixed(1);
fontSize = 25;
eFontStyle = 1; //Regular:0, Bold:1, Italic:2, Underline:4, Strikeout:8
X = 30;
Y = 35;
fontColorR = 255;
fontColorG = 255;
fontColorB = 255;
outlineColorR = 0;
outlineColorG = 0;
outlineColorB = 0;
if(dZoomRatio > 1) // for IE
{
$("#digitalZoomRatio").text(zoomText).css({
"font-size":fontSize,
"left":X+"px",
"top":Y+"px",
"color": "rgb(" + fontColorR +"," + fontColorG + "," + fontColorB +")"
});
switch (eFontStyle)
{
case 1:
$("#digitalZoomRatio").css({"font-weight":"bold", "font-style":"normal", "text-decoration":"none"});
break;
case 2:
$("#digitalZoomRatio").css({"font-weight":"noraml", "font-style":"italic", "text-decoration":"none"});
break;
case 4:
$("#digitalZoomRatio").css({"font-weight":"noraml", "font-style":"normal", "text-decoration":"underline"});
break;
default:
$("#digitalZoomRatio").css({"font-weight":"normal", "font-style":"normal", "text-decoration":"none"});
}
/*
try {
PLUGIN_ID.DisplayStringOnVideo(zoomText, fontSize, eFontStyle, X, Y, fontColorR, fontColorG, fontColorB, outlineColorR, outlineColorG, outlineColorB);
}catch(e){console.log(e)}
*/
}
else
{
$("#digitalZoomRatio").html("");
/*
try {
PLUGIN_ID.DisplayStringOnVideo("", fontSize, eFontStyle, X, Y, fontColorR, fontColorG, fontColorB, outlineColorR, outlineColorG, outlineColorB);
}catch(e){}
*/
}
}
}
function updateStatus(type)
{
$.ajax({
url: "/cgi-bin/camctrl/eCamCtrl.cgi?stream=" + streamsource,
async: true,
cache: false,
success: function(data){
Log("[updateStatus] return => %s",data);
if (type == "zoom")
DisplayZoomRatio(data);
else
parseCoords(data); //Also upate the latest ROI for GlobalView
}
});
}
var DM365_MPEG4_HEIGHT_LIMIT=984;
function Normalize(num, multiple)
{
return parseInt(num/multiple)*multiple;
}
From there you catch this little snippend, paste this to the IP address and you get a feed (image):
/cgi-bin/viewer/video.jpg?streamid=2&resolution=400x300&quality=5
If we go here: /include/plugindef_winless.js
We see the following (not much use as far as I can tell right now)
Code: Select all
streamsource=getCookie("streamsource");
if(streamsource > (capability_nmediastream - 1))
{
streamsource = 0;
setCookie("streamsource", 0);
}
streamingbuffertime=getCookie("streamingbuffertime");
eval("VideoSize=videoin_c0_s"+streamsource+"_resolution");
eval("codectype=videoin_c0_s"+streamsource+"_codectype");
if(codectype=="mpeg4" || codectype=="h264")
eval("AccessName=network_rtsp_s"+streamsource+"_accessname");
else
eval("AccessName=network_http_s"+streamsource+"_accessname");
/* RTSP plug-in defines */
var PLUGIN_ID = "WinLessPluginCtrl";
var PLUGIN_NAME = "Toshiba_Plugin_Installer.exe";
var PLUGIN_VER = "1,0,0,84";
var CLASS_ID = "64865E5A-E8D7-44C1-89E1-99A84F6E56D0";
var FFTYPE = "application/x-streamctrl";
var FF_VER = "1.0.0.84";
var VNDPWRAPPER_VER = "1,0,0,55";
var FF_XPI_DESCRIPTION = "Installer Management v" + FF_VER;
var X_OFFSET = 10;
var Y_OFFSET = 30;
var X_OFFSET_CTRL = X_OFFSET;
var Y_OFFSET_CTRL = Y_OFFSET + 36;
var X_OFFSET_MD = X_OFFSET + 220;
var Y_OFFSET_MD = Y_OFFSET;
var CSET_TYPE = 101;
var CSET_HEIGHT = 200;
var STRETCH = "false";
var PLUGIN_LANG="EN";
var ss_width_offset = 40;
var ss_height_offset = 90;
var Width, Height;
var BaseWidth = 320;
var BaseHeight = 240;
//This must be a ascending list, and match following "switch case"
var VideoSizeAry = ["176x144", "320x240", "360x240", "640x480", "720x480", "800x600", "1280x720", "1280x960", "1280x1024", "1600x1200"];
function evalPluginSize()
{
switch(VideoSize)
{
case "1600x1200":
Width = 1600;
Height = 1200;
W = 1600;
H = 1200;
break;
case "1280x1024":
Width = 1280;
Height = 1024;
W = 1280;
H = 1024;
break;
case "1280x720":
Width = 1280;
Height = 720;
W = 1280;
H = 720;
break;
case "1280x960":
Width = 1280;
Height = 960;
W = 1280;
H = 960;
break;
case "800x600":
Width = 800;
Height = 600;
W = 800;
H = 600;
break;
case "720x480":
Width = 720;
Height = 480;
W = 720;
H = 480;
break;
case "640x480":
Width = 640;
Height = 480;
W = 640;
H = 480;
break;
case "360x240":
Width = 360;
Height = 240;
W = 360;
H = 240;
break;
case "320x240":
Width = 320;
Height = 240;
W = 320;
H = 240;
break;
case "176x144":
Width = 176;
Height = 144;
W = 176;
H = 144;
STRETCH = "false";
break;
case "D1":
Width = 720;
if (status_videomode_c0 == "pal")
Height = 576;
else if (status_videomode_c0 == "ntsc")
Height = 480;
W = Width;
H = Height;
STRETCH = "true";
break;
case "4CIF":
Width = 704;
if (status_videomode_c0 == "pal")
Height = 576;
else if (status_videomode_c0 == "ntsc")
Height = 480;
W = Width;
H = Height;
STRETCH = "true";
break;
case "CIF":
Width = 352;
if (status_videomode_c0 == "pal")
Height = 288;
else if (status_videomode_c0 == "ntsc")
Height = 240;
W = Width;
H = Height;
STRETCH = "true";
break;
case "QCIF":
Width = 176;
if (status_videomode_c0 == "pal")
Height = 144;
else if (status_videomode_c0 == "ntsc")
Height = 120;
W = Width;
H = Height;
STRETCH = "true";
break;
default:
W = Width = parseInt(VideoSize.split('x')[0]);
H = Height = parseInt(VideoSize.split('x')[1]);
/*Width = parseInt(VideoSize.split('x')[0]);
Height = parseInt(VideoSize.split('x')[1]);
for(index = 0; index < VideoSizeAry.length; index++)
{
var tmpWidth = parseInt(VideoSizeAry[index].split("x")[0]);
var tmpHeight = parseInt(VideoSizeAry[index].split("x")[1]);
if((Width <= tmpWidth) && (Height <= tmpHeight))
{
W = tmpWidth;
H = tmpHeight;
break;
}
}*/
STRETCH = "false";
break;
}
}
evalPluginSize();
So there's a good bit you can find under the bonnet if you take a look. I've only started messing with it and I'm calling it a month on this project since I'm super busy with school but it looks like we can actually get the smaller/ lower resolution streams, although at the same FPS. I'm not sure how the JPEG thing works. Maybe we can choose the FPS that zoneminder will ask the camera for a JPEG? I'm not sure how those settings even work both for the camera and zoneminder so please excuse my ignorance here.
I'm just super glad to get it working up to this point. I got it dirt cheap on ebay and you can find these from time to time for pennies on the dollar compared to a new camera. I do miss a working web interface though.