⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pthread_enc.c

📁 1、基于韩国at2041芯片开发的Linux环境的DVR代码。 2、以原来代码进行了修改。 3、主要修改网络通讯出现异常问题处理 4、硬盘覆盖录像不起作用
💻 C
📖 第 1 页 / 共 4 页
字号:
			v_mbsize = 30;			} else if (psp->gp.resolution == CIF) {				h_mbsize = 22;			v_mbsize = 15;			}    	   	   	}			for (ii = 0; ii < 16; ii++) {		if (ii < MAX_CH_NUM) {			video_ch_info[ii].stream_type = STREAM_TYPE_MPEG4;			video_ch_info[ii].mb_width = h_mbsize;			video_ch_info[ii].mb_height = v_mbsize;			audio_ch_info[ii].stream_type = STREAM_TYPE_ADPCM;   		} else {			video_ch_info[ii].stream_type = STREAM_TYPE_DUMMY;			video_ch_info[ii].mb_width = 0;			video_ch_info[ii].mb_height = 0;			audio_ch_info[ii].stream_type = STREAM_TYPE_DUMMY;		}	}	/* make ps header */	ret = make_pshdr(hdr, video_ch_info, audio_ch_info);	/* write to file */	#ifndef LOOPTHROUGH_MODE	fwrite(hdr, sizeof(char), ret, sp_enc_object->p_fd_ps); fflush(sp_enc_object->p_fd_ps);#endif	/* free malloc */	free(hdr);		return SUCCESS;  }S32 make_pshdr(UNS8 *hdr, CHINFO *v_ch_info, CHINFO *a_ch_info){  S32	i;  UNS8	*phdr;  phdr = hdr;  /*    * pack header    */  *(phdr++) = 0x00;            // pack_start_code  *(phdr++) = 0x00;  *(phdr++) = 0x01;  *(phdr++) = 0xBA;  *(phdr++) = 0x44;            // SCR - SCR value is 0  *(phdr++) = 0x00;   *(phdr++) = 0x04;   *(phdr++) = 0x00;   *(phdr++) = 0x04;   *(phdr++) = 0x01;   *(phdr++) = 0x01;            // program_mux_rate : 10 Mbps  *(phdr++) = 0x86;   *(phdr++) = 0xA3;   *(phdr++) = 0xFA;            // reserved 5-bit, pack_stuffing_length:2  *(phdr++) = 0xFF;   *(phdr++) = 0xFF;   /*   * program stream map   */  *(phdr++) = 0x00;            // start_code  *(phdr++) = 0x00;  *(phdr++) = 0x01;  *(phdr++) = 0xBC;            // map_stream_id  *(phdr++) = (270>>8) & 0xff; // program_stream_map_length  *(phdr++) = (270) & 0xff;   *(phdr++) = 0xE0 | (PROGRAM_STREAM_MAP_VERSION & 0x1f);   *(phdr++) = 0xFF;            // reserved, marker_bit  *(phdr++) = 0x00;            // program_stream_info_length: 0  *(phdr++) = 0x08;   *(phdr++) = 0x00;   *(phdr++) = 0x00;   *(phdr++) = 0x00;   *(phdr++) = 0x00;   *(phdr++) = 0xff;				// reserved  *(phdr++) = 0xff;				// reserved  *(phdr++) = 0xff;				// reserved  *(phdr++) = 0xff;				// reserved   *(phdr++) = (256>>8) & 0xff; // elementary_stream_map_length: 256  *(phdr++) = (256) & 0xff;   // video info  for (i=0; i<16; i++)  {    *(phdr++) = v_ch_info[i].stream_type; // stream_type    *(phdr++) = 0xE0 | (i & 0xf);         // stream_id    *(phdr++) = 0x00;                     // info_length: 4    *(phdr++) = 0x04;     *(phdr++) = v_ch_info[i].mb_width & 0xff;    // mb_width    *(phdr++) = v_ch_info[i].mb_height & 0xff;   // mb_height    *(phdr++) = 0xFF;                     // reserved    *(phdr++) = 0xFF;                     // reserved  }  // audio info  for (i=0; i<16; i++)  {    *(phdr++) = a_ch_info[i].stream_type; // stream_type    *(phdr++) = 0xC0 | (i & 0xf);         // stream_id    *(phdr++) = 0x00;                     // info_length: 4    *(phdr++) = 0x04;     *(phdr++) = 0xFF;                     // reserved    *(phdr++) = 0xFF;                     // reserved    *(phdr++) = 0xFF;                     // reserved    *(phdr++) = 0xFF;                     // reserved  }  return (phdr - hdr); // return header length}RETURN stop_encoding(ENC_OBJECT *peo){	S8		end_time[16];		time_t	end_time_t;	struct tm	end_tm;	/* 1st. stop recording */	video_encoder_stop();	/* 2nd. get end time */	get_time(&end_time_t, &end_tm, MODE_1);	sprintf(end_time,"%02d%02d%02d", end_tm.tm_hour, end_tm.tm_min, end_tm.tm_sec);	/* 3rd. update db info */	strcpy(peo->db_nrec.end_time, end_time);												/* 4th. close file */	fclose(peo->p_fd_ps);	/* 5th. check dummy file */	if (check_dummy_file(peo) == TRUE) {				/* 6th. update normal db */ 							    if (at2041_update_db_normal(peo) == FAILURE) {			m_ERROR("pthread_enc.c:error In function 'at2041_update_db_normal'\n");			return FAILURE;	    }	}		return SUCCESS;	}RETURN get_data_inform_from_stream(ENC_OBJECT *peo){	UNS16	skip;	time_t	cur_time_t;	struct tm	cur_tm;		peo->pps = gp_state_thread;	/* read current time */	get_time(&cur_time_t, &cur_tm, MODE_0);		peo->info_picture.size = ((UNS32)peo->p_mux_buf[1]) * 16 * 2; // Byte		peo->info_picture.data_type = peo->p_mux_buf[0] & 0x0f;	peo->info_picture.type = (peo->p_mux_buf[0] >> 12) & 0x03; 	peo->info_picture.ch = (peo->p_mux_buf[0] >> 4) & 0x0f;	if (peo->p_mux_buf[4] == 0x0000 && 		((peo->p_mux_buf[5] & 0xfff0) == 0x01e0 || 		(peo->p_mux_buf[5] & 0xfff0) == 0x01c0)) 	{		peo->info_picture.start_flag = 1;	} else {		peo->info_picture.start_flag = 0;	}	peo->info_picture.last_flag = (peo->p_mux_buf[0] >> 11) & 0x01;#if 1//xchannel ( when the split frame )	/* PASS : isn't start of picture */	if (!peo->info_picture.start_flag) {		return PASS;	}#endif	peo->info_picture.loss = (peo->p_mux_buf[0] >> 9) & 0x01;	skip = (peo->p_mux_buf[0] >> 8) & 0x01;	if (!skip) {				peo->event_ch[peo->info_picture.ch].cur_motion = 1;		/* insert motion info in state thread */		peo->pps->state_enc.enc_ch[peo->info_picture.ch].motion = 1;		} else {		peo->event_ch[peo->info_picture.ch].cur_motion = 0;		/* insert motion info in state thread */		peo->pps->state_enc.enc_ch[peo->info_picture.ch].motion = 0;			}	peo->info_picture.motion_start = 0;	peo->info_picture.motion_end = 0;		peo->event_ch[peo->info_picture.ch].cur_sensor = peo->pps->state_enc.enc_ch[peo->info_picture.ch].sensor;	peo->info_picture.sensor_start = 0;	peo->info_picture.sensor_end = 0;		peo->info_picture.time = cur_time_t;	peo->info_picture.start_fp = TX_BUF_SIZE;	peo->info_picture.event_indicator = 0;	return SUCCESS;}BOOL stream_filter(ENC_OBJECT *peo){	PTHREAD_STATE	*pps;	pps = gp_state_thread;	peo->psp = gp_setup_param;	/* filtering encoded stream for manual and schedule */	if (pps->state_enc.manual_rec) {		return TRUE;	} else if (pps->state_enc.schedule_rec) {		if (pps->state_enc.enc_ch[peo->info_picture.ch].schedule) {			return TRUE;		} else {			return FALSE;		}	} else {		return FALSE;	}	/* filtering encoded stream for record mode */	if (peo->info_picture.data_type == DT_VIDEO) {		if (peo->psp->enc_ch[peo->info_picture.ch].flag_conti_rec) {			return TRUE;		} 		if (peo->psp->enc_ch[peo->info_picture.ch].motion.flag) {			return TRUE;		}		if (peo->psp->enc_ch[peo->info_picture.ch].sensor.flag_in) {			return TRUE;		}		} else if (peo->info_picture.data_type == DT_AUDIO) {		if (peo->psp->enc_ch[peo->info_picture.ch].flag_conti_rec) {			return TRUE;		} 			if (peo->psp->enc_ch[peo->info_picture.ch].motion.flag) {			return TRUE;		}		if (peo->psp->enc_ch[peo->info_picture.ch].sensor.flag_in) {			return TRUE;		}		}	return FALSE;}RETURN check_event_from_picture_info(ENC_OBJECT *peo){	UNS16	cur_motion;	UNS16	prev_motion;		UNS16	cur_sensor;	UNS16	prev_sensor;	PTHREAD_BUF		signal;			peo->psp = gp_setup_param;	/* PASS : isn't start of picture */	if (!peo->info_picture.start_flag) {		return PASS;	}		if (peo->info_picture.data_type == DT_VIDEO) {		/* check motion info */		if (peo->psp->enc_ch[peo->info_picture.ch].motion.flag) {			cur_motion = peo->event_ch[peo->info_picture.ch].cur_motion;			prev_motion = peo->event_ch[peo->info_picture.ch].prev_motion;			if (cur_motion != prev_motion) {				if (cur_motion) {					peo->info_picture.motion_start = 1;					/* send message for motion event info */					signal.start_id = PTHREAD_ENC;					signal.m_signal = SIGNAL_0;								signal.m_value = 1;								signal.m_channel = peo->info_picture.ch;										if (pthread_send_signal(&signal, PTHREAD_LIVE) == FALSE) {						m_ERROR("pthread_enc.c:error: In function 'pthread_send_signal'\n");					}										} else {					peo->info_picture.motion_end = 1;					/* send message for motion event info */					signal.start_id = PTHREAD_ENC;					signal.m_signal = SIGNAL_0;								signal.m_value = 0;								signal.m_channel = peo->info_picture.ch;										if (pthread_send_signal(&signal, PTHREAD_LIVE) == FALSE) {						m_ERROR("pthread_enc.c:error: In function 'pthread_send_signal'\n");					}										}				peo->event_ch[peo->info_picture.ch].prev_motion = cur_motion;			}		}		/* check sensor info */				if (peo->psp->enc_ch[peo->info_picture.ch].sensor.flag_in) {			cur_sensor = peo->event_ch[peo->info_picture.ch].cur_sensor;			prev_sensor = peo->event_ch[peo->info_picture.ch].prev_sensor;									if (cur_sensor != prev_sensor) {				if (cur_sensor) {					peo->info_picture.sensor_start = 1;					/* send message for sensor event info */					signal.start_id = PTHREAD_ENC;					signal.m_signal = SIGNAL_1;								signal.m_value = 1;								signal.m_channel = peo->info_picture.ch;										if (pthread_send_signal(&signal, PTHREAD_LIVE) == FALSE) {						m_ERROR("pthread_enc.c:error: In function 'pthread_send_signal'\n");					}									} else {					peo->info_picture.sensor_end = 1;					/* send message for sensor event info */					signal.start_id = PTHREAD_ENC;					signal.m_signal = SIGNAL_1;								signal.m_value = 0;								signal.m_channel = peo->info_picture.ch;										if (pthread_send_signal(&signal, PTHREAD_LIVE) == FALSE) {						m_ERROR("pthread_enc.c:error: In function 'pthread_send_signal'\n");					}										}				peo->event_ch[peo->info_picture.ch].prev_sensor = cur_sensor;			}		}		}	return SUCCESS;}RETURN insert_picture_info_in_stream(ENC_OBJECT *peo){	peo->psp = gp_setup_param;		/* PASS : isn't start of picture */	if (!peo->info_picture.start_flag) {		return PASS;	}		/* read event info */	peo->info_picture.event_indicator = peo->p_mux_buf[peo->info_picture.start_fp + 13];	// 13: location for event info		if (peo->info_picture.data_type == DT_VIDEO) {		/* continuous record */		if (peo->psp->enc_ch[peo->info_picture.ch].flag_conti_rec) {			/* insert continue record set bit */			peo->info_picture.event_indicator |= 0x0080;		// frame_conti_indicator set		} else {			/* insert continue record clear bit */			peo->info_picture.event_indicator &= 0xff7f;		// frame_conti_indicator clear		}				/* motion record */		if (peo->psp->enc_ch[peo->info_picture.ch].motion.flag) {			if (peo->info_picture.motion_start) {				peo->event_ch[peo->info_picture.ch].set_motion ++;							}			if (peo->info_picture.motion_end) {								if (peo->event_ch[peo->info_picture.ch].set_motion != 0) {					peo->event_ch[peo->info_picture.ch].set_motion --;									} else {					m_MSG("\t!!! Warnning: set_motion flag !!!\n");				}			}			if (peo->event_ch[peo->info_picture.ch].set_motion) {				if (peo->info_picture.type == I_PICTURE) {					if (!peo->event_ch[peo->info_picture.ch].first_flag_motion) {						peo->event_ch[peo->info_picture.ch].first_I_motion = 1;					}					peo->event_ch[peo->info_picture.ch].insert_motion = 1;				}				if (peo->event_ch[peo->info_picture.ch].first_I_motion) {					peo->info_picture.event_indicator |= 0x0004;		// new_start_after_frame_motion_indicator set					peo->event_ch[peo->info_picture.ch].first_flag_motion = 1;					peo->event_ch[peo->info_picture.ch].first_I_motion = 0;				} else {					peo->info_picture.event_indicator &= 0xfffb;		// new_start_after_frame_motion_indicator clear				}				if (peo->event_ch[peo->info_picture.ch].insert_motion) {					/* insert motion set bit */					peo->info_picture.event_indicator |= 0x0008;		// frame_motion_indicator set					/* insert motion info in record db */					peo->db_nrec.motion = 1;				} else {					/* insert motion clear bit */					peo->info_picture.event_indicator &= 0xfff7;		// frame_motion_indicator clear				}			}else {				peo->event_ch[peo->info_picture.ch].first_flag_motion = 0;				peo->event_ch[peo->info_picture.ch].insert_motion = 0;				/* insert motion clear bit */				peo->info_picture.event_indicator &= 0xfff3;		// frame_motion_indicator clear			}		} else {			/* insert motion clear bit */			peo->info_picture.event_indicator &= 0xfff3;		// frame_motion_indicator clear		}				/* sensor record */		if (peo->psp->enc_ch[peo->info_picture.ch].sensor.flag_in) {			if (peo->info_picture.sensor_start) {				peo->event_ch[peo->info_picture.ch].set_sensor ++;			}			if (peo->info_picture.sensor_end) {				if (peo->event_ch[peo->info_picture.ch].set_sensor != 0) {					peo->event_ch[peo->info_picture.ch].set_sensor --;									} else {					m_MSG("\t!!! Warnning: set_sensor flag !!!\n");				}			}			if (peo->event_ch[peo->info_picture.ch].set_sensor) {				if (peo->info_picture.type == I_PICTURE) {					if (!peo->event_ch[peo->info_picture.ch].first_flag_sensor) {						peo->event_ch[peo->info_picture.ch].first_I_sensor = 1;					}					peo->event_ch[peo->info_picture.ch].insert_sensor = 1;				}				if (peo->event_ch[peo->info_picture.ch].first_I_sensor) {					peo->info_picture.event_indicator |= 0x0020;		// new_start_after_frame_sensor_indicator set					peo->event_ch[peo->info_picture.ch].first_flag_sensor = 1;					peo->event_ch[peo->info_picture.ch].first_I_sensor = 0;				} else {					peo->info_picture.event_indicator &= 0xffdf;		// new_start_after_frame_sensor_indicator clear				}				if (peo->event_ch[peo->info_picture.ch].insert_sensor) {					/* insert sensor set bit */					peo->info_picture.event_indicator |= 0x0040;		// frame_sensor_indicator set					/* insert sensor info in record db */					peo->db_nrec.sensor = 1;									} else {					/* insert sensor clear bit */					peo->info_picture.event_indicator &= 0xffbf;		// frame_sensor_indicator clear				}			}else {				peo->event_ch[peo->info_picture.ch].first_flag_sensor = 0;				peo->event_ch[peo->info_picture.ch].insert_sensor = 0;				/* insert sensor clear bit */				peo->info_picture.event_indicator &= 0xff9f;		// frame_sensor_indicator clear			}		} else {			/* insert sensor clear bit */			peo->info_picture.event_indicator &= 0xff9f;		// frame_sensor_indicator clear		}								} else if (peo->info_picture.data_type == DT_AUDIO) {		/* continuous record */		if (peo->psp->enc_ch[peo->info_picture.ch].flag_conti_rec) {			/* insert continue record set bit */			peo->info_picture.event_indicator |= 0x0080;		// frame_conti_indicator set		} else {			/* insert continue record clear bit */			peo->info_picture.event_indicator &= 0xff7f;		// frame_conti_indicator clear		}				/* motion record */		if (peo->psp->enc_ch[peo->info_picture.ch].motion.flag) {			if (peo->event_ch[peo->info_picture.ch].insert_motion) {				/* insert motion set bit */				peo->info_picture.event_indicator |= 0x0008;		// frame_motion_indicator set			} else {				/* insert motion clear bit */				peo->info_picture.event_indicator &= 0xfff3;		// frame_motion_indicator clear			}		} else {			/* insert motion clear bit */			peo->info_picture.event_indicator &= 0xfff3;		// frame_motion_indicator clear		}			/* sensor record */		if (peo->psp->enc_ch[peo->info_picture.ch].sensor.flag_in) {			if (peo->event_ch[peo->info_picture.ch].insert_sensor) {				/* insert sensor set bit */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -