📄 dsdemo.c
字号:
}
#ifdef PREVIEWOPEN
if(previewtimer){
gtk_timeout_remove(previewtimer);
previewtimer = 0;
}
#endif
if(imagetimer){
gtk_timeout_remove(imagetimer);
imagetimer = 0;
}
if(logoptr)
free(logoptr);
if(GTK_TOGGLE_BUTTON(w_audio_preview)->active){
SetAudioPreview(ChannelHandle[audiopreviewport], 0); /* port audio preview */
}
#ifdef PREVIEWOPEN
g_bPreviewStart = 0;
memset(bPreviewOpen, 0, sizeof(bPreviewOpen));
for(port=0;port<totalport;port++)
{
#ifndef USE_PREVIEW_TIMER
sem_post(previewconf[port].SyncSem); //for the sem_wait is a block wait
bPreviewThreadRun[port] = 3;
while(bPreviewThreadRun[port] == 3)
usleep(100);
#endif
}
memset(bPreviewThreadRun,0,sizeof(bPreviewThreadRun));
if(GTK_TOGGLE_BUTTON(w_preview)->active){
if(full_win_flag){
if(StopVideoPreview(ChannelHandle[clickport]) < 0)
printf("StopVideopreview(port %d) failed, error 0x%x\n", clickport, GetLastErrorNum());
if(pOverlaySurface[clickport]!=NULL)
{
SDL_FreeYUVOverlay(pOverlaySurface[clickport]);
pOverlaySurface[clickport] = NULL;
}
}
else{
//yxq test the preview
for(port = 0; port < totalport; port++)
{
if(StopVideoPreview(ChannelHandle[port]) < 0)
printf("StopVideopreview(port %d) failed, error 0x%x\n", port, GetLastErrorNum());
if(pOverlaySurface[port]!=NULL)
{
SDL_FreeYUVOverlay(pOverlaySurface[port]);
pOverlaySurface[port] = NULL;
}
}
}
}
for(port=0;port<totalport;port++)
sem_destroy(previewconf[port].SyncSem);
#endif
for(port = 0; port < totalport; port++)
{
StopMotionDetection(ChannelHandle[port]);
end_record(port);
if((record_flag[port]) && (StopVideoCapture(ChannelHandle[port]) < 0)){
printf("StopVideoCapture(port %d) failed, error 0x%x\n", port, GetLastErrorNum());
record_flag[port] = 0;
}
ChannelClose(ChannelHandle[port]);
}
memset(motion_data, 0, sizeof(motion_data));
#ifdef RAWSTREAM
if(imagefile_fd)
close(imagefile_fd);
#endif
gdk_flush();
SDL_Quit();/* yxq add at 2004.8.27*/
gtk_main_quit();
printf("ok\n");
}
int process_time_loop(gpointer data)
{
int port;
/* If no enough space, reset count*/
if(fullflag)
{
for(port = 0; port < totalport; port++)
{
if(old_count[port] < count[port])
{
memcpy(old_count, count, sizeof(count));
memset(count, -1, sizeof(count));
break;
}
}
}
else
{
if((bbuf.f_bavail * (bbuf.f_bsize/1024)) <= limitsize) /* count in 1KB */
{
printf("No enough space.avialable blocks = %ld\n", bbuf.f_bavail);
memcpy(old_count, count, sizeof(count));
memset(count, -1, sizeof(count));
fullflag = 1;
}
}
/*add at 2002.4.1 */
for(port = 0; port < totalport; port++)
{
int retval;
if(record_flag[port] == 0)
continue;
end_record(port);
count[port] ++;
#ifdef WRITE_FILE
sprintf(filename[port], "%s/test%02d%d.mp4", savepath, port, count[port]); /* modify at 2002.4.1 */
if((retval = open(filename[port], O_WRONLY | O_CREAT |O_TRUNC, S_IRWXU|S_IRWXG|S_IRWXO)) < 0)
perror(">>> open");
else{
ftruncate(retval, 0);
write(retval, file_head[port], 40);
record_fd[port] = retval;
}
sprintf(filename[port], "%s/test%02d%d.dat", savepath, port, count[port]); /*test the index at 2005.6.2 */
if((retval = open(filename[port], O_WRONLY | O_CREAT |O_TRUNC, S_IRWXU|S_IRWXG|S_IRWXO)) < 0)
perror(">>> open");
else{
ftruncate(retval, 0);
index_fd[port] = retval;
nodeinfo[port].FilePos = 40;
nodeinfo[port].FrameNum = 0;
}
if(cifqcif_flag[port])
{
sprintf(filename[port], "%s/test%02d%d_1.mp4", savepath, port, count[port]); /* modify at 2002.4.1 */
if((retval = open(filename[port], O_WRONLY | O_CREAT |O_TRUNC, S_IRWXU|S_IRWXG|S_IRWXO)) < 0)
perror(">>> open");
else{
ftruncate(retval, 0);
write(retval, cifqciffile_head[port], 40);
cifqcif_fd[port] = retval;
}
}
#endif
}
return TRUE; //if return 0, will never call this func.
}
int process_time(gpointer data)
{
/*
time_t now;
struct tm *tm;
*/
char buf[100];
char tmp[] = "%";
//struct statfs bbuf;
int freespace;
static int totalframe;
float audioframerate,videoframerate;
FRAMES_STATISTICS frame_statistics;
int usercount;
int i;
int bit_rate,tmptime;
static int timecount = 0;
//printf("%ld\n", SDL_GetTicks());
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_VIEW(w_status[1]), strlen(timebuf));
// gtk_text_insert(GTK_TEXT_VIEW(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);
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);
/* frame information */
elapse_time = g_timer_elapsed(count_timer,NULL);
GetFramesStatistics(ChannelHandle[selectport], &frame_statistics);
audioframerate = frame_statistics.AudioFrames/elapse_time;
sprintf(buf, "%8.1f", audioframerate);
gtk_text_buffer_set_text(w_audio_framerate_buffer, buf, strlen(buf));
gtk_text_view_set_buffer(GTK_TEXT_VIEW(w_audio_framerate), w_audio_framerate_buffer);
// gtk_text_backward_delete(GTK_TEXT_VIEW(w_audio_framerate), strlen(buf));
// gtk_text_insert(GTK_TEXT_VIEW(w_audio_framerate), NULL, NULL, NULL, buf, -1);
videoframerate = frame_statistics.VideoFrames/elapse_time;
sprintf(buf, "%8.1f", videoframerate);
gtk_text_buffer_set_text(w_video_framerate_buffer, buf, strlen(buf));
gtk_text_view_set_buffer(GTK_TEXT_VIEW(w_video_framerate), w_video_framerate_buffer);
// gtk_text_backward_delete(GTK_TEXT_VIEW(w_video_framerate), strlen(buf));
// gtk_text_insert(GTK_TEXT_VIEW(w_video_framerate), NULL, NULL, NULL, buf, -1);
//bit rate
tmptime = elapse_time - bit_rate_time[selectport];
if(tmptime>0){
bit_rate = (bit_rate_size[selectport] * 8)/(elapse_time - bit_rate_time[selectport]);
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);
}
totalframe = frame_statistics.VideoFrames + frame_statistics.AudioFrames;
sprintf(buf, "%10d", totalframe);
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_VIEW(w_totalframe), strlen(buf));
// gtk_text_insert(GTK_TEXT_VIEW(w_totalframe), NULL, NULL, NULL, buf, -1);
usercount = MP4_ServerGetState();
if(usercount>0)
{
sprintf(buf,"%7d", usercount);
gtk_text_buffer_set_text(w_netusercount_buffer, buf, strlen(buf));
gtk_text_view_set_buffer(GTK_TEXT_VIEW(w_netusercount), w_netusercount_buffer);
// gtk_text_backward_delete(GTK_TEXT_VIEW(w_netusercount), strlen(buf));
// gtk_text_insert(GTK_TEXT_VIEW(w_netusercount), NULL, NULL, NULL, buf, -1);
}
else{
sprintf(buf," 0");
gtk_text_buffer_set_text(w_netusercount_buffer, buf, strlen(buf));
gtk_text_view_set_buffer(GTK_TEXT_VIEW(w_netusercount), w_netusercount_buffer);
// gtk_text_backward_delete(GTK_TEXT_VIEW(w_netusercount), strlen(buf));
// gtk_text_insert(GTK_TEXT_VIEW(w_netusercount), NULL, NULL, NULL, buf, -1);
}
return TRUE; //if return 0, will never call this func.
}
void process_buttons(GtkWidget *widget, gpointer data)
{
int i, port;
//char filename[40];
int retval = 0;
i = GPOINTER_TO_INT(data);
switch(i){
case 2: //exit
my_exit();
break;
case 3:/* get image */
{
static int image_count = 0;
unsigned char imagebuf[704 * 576 * 2];
int size; //;= 384 * 288 *2;
char filename[100];
#ifdef YUVFILE
int fid;
#endif
for(port = 0; port < totalport; port++){
retval = GetOriginalImage(ChannelHandle[port], imagebuf, &size);
#ifdef BMPFILE
sprintf(filename, "cap%d%d.bmp", port, image_count);
if(retval < 0){
printf("GetOriginalImage return %d\n", retval);
continue;
}
else
{
printf("GetOriginalImage OK size = %d\n", size);
if(size == 704 * 576 * 2)//PAL
SaveYUVToBmpFile(filename, imagebuf, 704, 576);
if(size == 704 * 480 * 2)//NTSC
SaveYUVToBmpFile(filename, imagebuf, 704, 480);
}
#endif
#ifdef YUVFILE
sprintf(filename, "cap%d.yuv", port);
fid = open(filename, O_WRONLY | O_CREAT | O_TRUNC , 0777);
if(fid < 0)
{
perror("get image:");
break;
}
size = 0;
retval = GetOriginalImage(ChannelHandle[port], imagebuf, &size);
if(retval < 0){
printf("GetOriginalImage return %d\n", retval);
continue;
}
else
{
printf(" size = %d\n", size);
write(fid, imagebuf, size);
}
close(fid);
#endif
}
image_count ++;
break;
}
case 4://capture I frame
for(port = 0; port < totalport; port++)
{
CaptureIFrame(ChannelHandle[port]);
break;
}
default:
break;
}
}
//video info changed
void ch_bscale(GtkAdjustment *adjust, gpointer data)
{
int i, port;
i = GPOINTER_TO_INT(data);
switch(i){
case 0:
v_info[0].Brightness = (gint)adjust->value;
break;
case 1:
v_info[0].Contrast = (gint)adjust->value;
break;
case 2:
v_info[0].Saturation = (gint)adjust->value;
break;
case 3:
v_info[0].Hue = (gint)adjust->value;
break;
default:
break;
}
for(port = 0; port < totalport; port++)
{
SetVideoPara(ChannelHandle[port],
v_info[0].Brightness, v_info[0].Contrast, v_info[0].Saturation, v_info[0].Hue);
}
}
/* add 2002.4.10 */
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;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -