Toshiba Dome Camera ik-wd04a

Post here to indicate any hardware you have used and which is known to work with ZoneMinder. Not for questions.
Post Reply
User avatar
mlw19mlw91
Posts: 14
Joined: Mon Aug 17, 2020 6:49 pm

Toshiba Dome Camera ik-wd04a

Post by mlw19mlw91 »

So there's like no documentation anywhere I can find on this camera that was working out for me. The camera seems to have been EOL'd (end of lifed) by toshiba, toshiba USA's camera division seems to have been acquired by another company, one thing after another, it took me a while to find the settings that worked best.
  • Protocol: RTPS
  • Method: RTP/UNICAST
  • Host Name: IP address
  • Port = 554
  • path = /live.sdp
  • resolution: 1280x800
  • Note: this camera takes a while to connect
The manual CAN be found on 3rd party websites, but good luck finding firmware anywhere. Also, the web interface doesn't work (it says the script is unresponsive or not working or something in the newest version of chrome and microsoft edge) so you're stuck at full resolution at 30 fps and it hogs some CPU compared to other cameras, but it's pretty good picture quality.

I like it. Can someone add this to the WIKI?
User avatar
mlw19mlw91
Posts: 14
Joined: Mon Aug 17, 2020 6:49 pm

Re: Toshiba Dome Camera ik-wd04a

Post by mlw19mlw91 »

Ok I just added it to the WIKI didn't know I could do that
User avatar
mlw19mlw91
Posts: 14
Joined: Mon Aug 17, 2020 6:49 pm

Re: Toshiba Dome Camera ik-wd04a

Post by mlw19mlw91 »

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.
User avatar
mlw19mlw91
Posts: 14
Joined: Mon Aug 17, 2020 6:49 pm

Re: Toshiba Dome Camera ik-wd04a

Post by mlw19mlw91 »

Guys, I'm such a dummy. I did all of this research on that, only to find that ZoneMinder had an onvif button in the new camera setup and it did everything for me, oh well, glad to have added this camera to the wiki :)
Post Reply