📄 mddemo.c
字号:
Clientinfo.m_sUserPassword = "userpassword1234567890";
Clientinfo.m_bUserCheck = 0;
Clientinfo.subshow_x = 0;
Clientinfo.subshow_y = 0;
Clientinfo.subshow_uWidth = 0;
Clientinfo.subshow_uHeight = 0;
Clientinfo.m_bSendMode = PTOPTCPMODE;
for(i=0;i<TotalChannel;i++)
{
Clientinfo.m_bRemoteChannel = atoi(serverchan[i]);
Clientinfo.m_sIPAddress = serverip[i];
fprintf(stderr,"<demo_info>chan%d to connect the server:%s!chan %d\n",i, Clientinfo.m_sIPAddress, Clientinfo.m_bRemoteChannel);
clienthandle[i] = MP4_ClientStart(&Clientinfo, ReadDataCallBack);
if(clienthandle[i]==-1){
fprintf(stderr,"<demo_info> clientstart error:%x\n",MP4_ClientGetLastErrorNum());
MP4_ClientCleanup();
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w_decodestream), FALSE);
return;
}
datasum[i] = 0;
header_len = 0;
fprintf(stderr,"<demo_info> to start capture!\n");
MP4_ClientStartCaptureEx(clienthandle[i], streamheader, &header_len);
if(header_len == 0)
{
fprintf(stderr,"<demo_info> have not get the stream header!\n");
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w_decodestream), FALSE);
return;
}
fprintf(stderr,"<demo_info> get the stream header!len:%d\n", header_len);
}
g_timer_start(count_timer);
for(i=0;i<TotalChannel;i++)
{
if(HW_OpenStream(ChannelHandle[i], streamheader, header_len) < 0)
{
fprintf(stderr,"<demo_info> open stream failed for decode!\n");
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w_decodestream), FALSE);
return;
}
if(HW_Play(ChannelHandle[i])<0)
fprintf(stderr,"<demo_info>in decode stream, play failed!\n");
sem_post(&beginSem[i]);
fprintf(stderr,"<demo_info> to start the display chan%d!flag is %d\n", i, bDisplayOpen[i]);
}
streamopenok = 1;
hik_set_sensitive("b_DecodeFile", 0);
hik_set_sensitive("b_videoaudioout", 1);
fprintf(stderr,"<demo_info> md start stream decode ok!\n");
}else{
stopstreamdecode();
hik_set_sensitive("b_DecodeFile", 1);
hik_set_sensitive("b_videoaudioout", 0);
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w_videoout), FALSE);
g_timer_stop(count_timer);
for(i=0;i<TotalChannel;i++)
datasum[i] = 0;
}
return;
}
void process_buttons(GtkWidget *widget, gpointer data)
{
int i, port;
int retval = 0;
i = GPOINTER_TO_INT(data);
switch(i){
case 2: //exit
demo_exit();
break;
default:
break;
}
}
int PtInRect(SDL_Rect rect, int x, int y)
{
if((x > (full_win.x + rect.x)) && (x < (full_win.x + rect.x + rect.w)) && (y > (full_win.y + rect.y)) && (y < (full_win.y + rect.y + rect.h)))
return 1; /* point in rect */
return 0;
}
int GetPort()
{
int port = -1;
int x, y, i;
gdk_window_get_pointer(w_full_area->window, &x, &y, NULL);
x += full_win.x;
y += full_win.y;
for(i = 0; i< TotalChannel; i++)
{
if(PtInRect(dstRect[i], x, y))
{
port = i;
break;
}
}
return port;
}
int click2(GtkWidget *widget, GdkEventButton *event, gpointer data)
{
int port, i;
UINT useSyncSem = 1;
port = GetPort();
if(port >= 0)
{
selectport = port;
gtk_entry_set_text(GTK_ENTRY(w_set_serverip), serverip[selectport]);
gtk_entry_set_text(GTK_ENTRY(w_set_serverchan), serverchan[selectport]);
}
if((!GTK_TOGGLE_BUTTON(w_decodefile_flag)->active)&&(!GTK_TOGGLE_BUTTON(w_decodestream)->active))
return 0;
fprintf(stderr,"<demo_info> enter the click2, the port is %d!\n", port);
if(event->type != GDK_2BUTTON_PRESS)
return TRUE;
if(clickflag)
{
if(port < 0)
return TRUE;
for(i = 0; i< TotalChannel; i++)
{
bDisplayOpen[i] = 0;
sem_post(&displaySem[i]); /* fixed at 2005.10.8 */
fprintf(stderr,"<demo_info> in click2 stop the display %d!\n", i);
//sometimes, the channel is not realy stop the display, so do a delay.
//of cause there have other more effective ways to do the wait that display stoped
//usleep(1000);
while(!bDisplayClose[i])
usleep(10);
}
clickport = port;
memcpy(&tmpRect, &dstRect[port], sizeof(SDL_Rect));
memcpy(&dstRect[port], &full_rect, sizeof(SDL_Rect));
sem_post(&beginSem[port]);
}
else
{
bDisplayOpen[clickport] = 0;
sem_post(&displaySem[clickport]); /* fixed at 2005.10.8 */
while(!bDisplayClose[clickport])
usleep(10);
memcpy(&dstRect[clickport], &tmpRect, sizeof(SDL_Rect));
/* generate expose event */
gdk_window_hide(w_full_area->window);
usleep(1000);
gdk_window_show(w_full_area->window);
gdk_window_clear(w_full_area->window);
for(i = 0; i < TotalChannel; i++){
sem_post(&beginSem[i]);
}
}
clickflag ^= 1;
return 0;
}
gint expose_ev( GtkWidget *widget,
GdkEvent *event,
gpointer data )
{
char *str1 = "DS-400xMD demo:";
GdkFont *font = NULL;
GdkColor color;
char title_str[160];
char tmpstr[] = " ";
sprintf(title_str, "%sThere have %d decode channels. %20s Start Time: %s", str1,TotalChannel, tmpstr, starttime);
camp = gdk_colormap_get_system();
gc1 = gdk_gc_new(title->window); //get GC
//title expose
if(widget->window == title->window)
{
//set title background
color.red = 0;
color.green = 0;
color.blue = 0xffff;
if(!gdk_color_alloc(camp, &color)){
g_error("Cannot allocate color\n");
}
gdk_window_set_background(widget->window, &color);
//set foreground
color.red = 0xffff;
color.green = 0xffff;
color.blue = 0xffff;
if(!gdk_color_alloc(camp, &color)){
g_error("Cannot allocate color\n");
}
gdk_gc_set_foreground(gc1, &color);
gdk_window_clear(widget->window);
//font = gdk_fontset_load("7x14,hanzigb16fs");
font = gdk_fontset_load("-*-*-*-*-normal--15-*-*-*-*-*-*");
if(font != NULL){
gdk_draw_text(widget->window, font, gc1, 10, 20, title_str, strlen(title_str));
gdk_font_unref(font);
}
return(TRUE);
}
//video_area expose
//allocte color
gc2 = gdk_gc_new(w_full_area->window); //get GC
if(gdk_color_parse("black", &color))
{
if( !gdk_colormap_alloc_color(camp, &color,FALSE, TRUE)){
g_error("Cannot allocate color\n");
}
}
gdk_window_set_background(widget->window, &color); //set background color
/* set foreground to sign motion block */
color.red = 0;
color.green = 0xffff;
color.blue = 0;
if(!gdk_color_alloc(camp, &color)){
g_error("Cannot allocate color\n");
}
gdk_gc_set_foreground(gc2, &color);
gdk_window_clear(widget->window);
return(TRUE);
}
int process_time(gpointer data)
{
char buf[100];
char tmp[] = "%";
int freespace;
unsigned long framerate;
unsigned long DecFrameNum;
FRAMES_STATISTICS frame_statistics;
int usercount;
int i;
int bit_rate;
static int timecount = 0;
now = time(NULL);
tm = localtime(&now);
strftime(timebuf, sizeof(timebuf), "%Y-%m-%d", tm);
gtk_text_buffer_set_text(w_status_buffer[0], timebuf, strlen(timebuf));
gtk_text_view_set_buffer(GTK_TEXT_VIEW(w_status[0]), w_status_buffer[0]);
//gtk_text_backward_delete(GTK_TEXT_VIEW(w_status[0]), strlen(timebuf));
//gtk_text_insert(GTK_TEXT_VIEW(w_status[0]), NULL, NULL, NULL, timebuf, -1);
strftime(timebuf, sizeof(timebuf), "%T", tm);
gtk_text_buffer_set_text(w_status_buffer[1], timebuf, strlen(timebuf));
gtk_text_view_set_buffer(GTK_TEXT_VIEW(w_status[1]), w_status_buffer[1]);
// gtk_text_backward_delete(GTK_TEXT(w_status[1]), strlen(timebuf));
// gtk_text_insert(GTK_TEXT(w_status[1]), NULL, NULL, NULL, timebuf, -1);
if(statfs(savepath, &bbuf) < 0){
printf("statsfs() faied, error: %d\n", errno);
//printf("savepath = %s, bbuf,f_bavail = %d, bbuf.f_blocks = %d\n", savepath, bbuf.f_bavail, bbuf.f_blocks);
}
else{
freespace = (100*bbuf.f_bavail)/bbuf.f_blocks;
sprintf(buf,"%3d%s", freespace, tmp);
}
//printf("total block = %d, availble block = %d, block size = %d\n", bbuf.f_blocks, bbuf.f_bavail, bbuf.f_bsize);
//printf("total block = %d, availble block = %d, block size = %d\n", bbuf.f_blocks, bbuf.f_bavail, bbuf.f_bsize);
gtk_text_buffer_set_text(w_status_buffer[2], buf, strlen(buf));
gtk_text_view_set_buffer(GTK_TEXT_VIEW(w_status[2]), w_status_buffer[2]);
// gtk_text_backward_delete(GTK_TEXT_VIEW(w_status[2]), strlen(buf));
// gtk_text_insert(GTK_TEXT_VIEW(w_status[2]), NULL, NULL, NULL, buf, -1);
sprintf(buf, "%9d", selectport);
gtk_text_buffer_set_text(w_channel_buffer, buf, strlen(buf));
gtk_text_view_set_buffer(GTK_TEXT_VIEW(w_channel), w_channel_buffer);
// gtk_text_backward_delete(GTK_TEXT_VIEW(w_channel), strlen(buf));
// gtk_text_insert(GTK_TEXT_VIEW(w_channel), NULL, NULL, NULL, buf, -1);
//bit rate
elapse_time = g_timer_elapsed(count_timer,NULL);
bit_rate = (datasum[selectport] * 8)/elapse_time;
sprintf(buf, "%10d", bit_rate);
gtk_text_buffer_set_text(w_bit_rate_buffer, buf, strlen(buf));
gtk_text_view_set_buffer(GTK_TEXT_VIEW(w_bit_rate), w_bit_rate_buffer);
//gtk_text_backward_delete(GTK_TEXT_VIEW(w_bit_rate), strlen(buf));
//gtk_text_insert(GTK_TEXT_VIEW(w_bit_rate), NULL, NULL, NULL, buf, -1);
/* frame information */
HW_GetCurrentFrameRate(ChannelHandle[selectport], &framerate);
sprintf(buf, "%10d", framerate);
gtk_text_buffer_set_text(w_decode_framerate_buffer, buf, strlen(buf));
gtk_text_view_set_buffer(GTK_TEXT_VIEW(w_decode_framerate), w_decode_framerate_buffer);
// gtk_text_backward_delete(GTK_TEXT(w_decode_framerate), strlen(buf));
// gtk_text_insert(GTK_TEXT(w_decode_framerate), NULL, NULL, NULL, buf, -1);
HW_GetPlayedFrames(ChannelHandle[selectport], &DecFrameNum);
sprintf(buf, "%10d", DecFrameNum);
gtk_text_buffer_set_text(w_totalframe_buffer, buf, strlen(buf));
gtk_text_view_set_buffer(GTK_TEXT_VIEW(w_totalframe), w_totalframe_buffer);
// gtk_text_backward_delete(GTK_TEXT(w_totalframe), strlen(buf));
// gtk_text_insert(GTK_TEXT(w_totalframe), NULL, NULL, NULL, buf, -1);
return TRUE; //if return 0, will never call this func.
}
int main(int argc, char *argv[])
{
GtkWidget *frame, *main_box, *hbox, *hbox1, *vbox1, *vbox2, *hbox2;
GtkWidget *label;
GdkVisual *visual;
int win_width, win_height;
int i, j;
pthread_attr_t attr;
char SDL_windowhack[32];
/* init the device */
fprintf(stderr,"<demo_info> Begin init the device!\n");
//XInitThreads();
HW_InitDecDevice(&TotalChannel);
fprintf(stderr,"<demo_info> There have %d channels in the system!\n", TotalChannel);
if(TotalChannel == 0)
{
fprintf(stderr,"<demo_info> There have no md device in this system!\n");
return -1;
}
for(i=0;i<TotalChannel;i++)
{
if(HW_ChannelOpen(i, &ChannelHandle[i])<0)
{
fprintf(stderr,"<demo_info> Open the decode channle failed!\n");
HW_ReleaseDecDevice();
}
}
displayChannelCount=GetDisplayChannelCount();
for(i=0; i<displayChannelCount; i++)
SetDisplayStandard(i, StandardPAL);
/* init display */
gtk_set_locale();
gtk_init(&argc, &argv);
camp = gdk_colormap_get_system();
//get display size
win_width = gdk_screen_width();
win_height = gdk_screen_height();
fprintf(stderr,"<demo_info> the screen w:%d h:%d!\n", win_width, win_height);
//visual = gdk_visual_get_system();
//create window
//md_window = gtk_window_new(GTK_WINDOW_POPUP);
md_window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_signal_connect(GTK_OBJECT(md_window),"delete_event",
GTK_SIGNAL_FUNC(demo_exit),NULL);
gtk_signal_connect(GTK_OBJECT(md_window),"destroy",
GTK_SIGNAL_FUNC(demo_exit),NULL);
gtk_window_set_position(GTK_WINDOW(md_window), GTK_WIN_POS_CENTER);
gtk_widget_set_usize(md_window, win_width, win_height);
frame = gtk_frame_new(NULL);
gtk_container_add(GTK_CONTAINER(md_window), frame);
main_box = gtk_vbox_new(FALSE, 0);
gtk_container_add(GTK_CONTAINER(frame), main_box);
hbox = gtk_hbox_new(FALSE, 0);
gtk_container_set_border_width(GTK_CONTAINER(hbox), 0);
gtk_box_pack_start(GTK_BOX (main_box), hbox, FALSE, /*TRUE*/FALSE, 0);
/******* title window *******/
title = gtk_drawing_area_new();
gtk_widget_set_usize(title, win_width, 30);
gtk_widget_set_events(title, GDK_EXPOSURE_MASK);
gtk_signal_connect(GTK_OBJECT (title), "expose_event",
GTK_SIGNAL_FUNC(expose_ev), NULL);
gtk_box_pack_start(GTK_BOX(hbox), title, FALSE, FALSE, 0);
/************* end title window ***********/
hbox = gtk_hbox_new(FALSE, 0);
gtk_box_pack_start(GTK_BOX(main_box), hbox, FALSE, TRUE, 0);
/***************** channel window **********************/
frame = gtk_frame_new(NULL);
gtk_box_pack_start(GTK_BOX(hbox), frame, FALSE, FALSE, 0);
full_win.w = WIN_W;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -