📄 pthread_enc.c
字号:
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 + -