📄 pthread_dec.c
字号:
if (pdo->dip.cur_size > DEC_MAX_BUF_SIZE) { printf("!!! CUR => [0x%d][0x%d]\n", pdo->dip.cur_size, pdo->tpp.cur_pes_packet_length); fflush(stdout); } if ( ((pdo->tpp.start_code & 0x000000f0)) == 0xE0) { pdo->dip.data_type = DT_VIDEO; } else if ( ((pdo->tpp.start_code & 0x000000f0)) == 0xC0) { pdo->dip.data_type = DT_AUDIO; } pdo->dip.type = (pdo->tpp.cur_pes_packet_length & 0x00000003); if (pdo->tpp.cur_pes_packet_length & 0x00000080) { pdo->dip.conti = 1; } else { pdo->dip.conti = 0; } if (pdo->tpp.cur_pes_packet_length & 0x00000008 ) { pdo->dip.motion = 1; } else { pdo->dip.motion = 0; } if (pdo->tpp.cur_pes_packet_length & 0x00000004 ) { pdo->dip.motion_start = 1; } else { pdo->dip.motion_start = 0; } if (pdo->tpp.cur_pes_packet_length & 0x00000040) { pdo->dip.sensor = 1; } else { pdo->dip.sensor = 0; } if (pdo->tpp.cur_pes_packet_length & 0x00000020) { pdo->dip.sensor_start = 1; } else { pdo->dip.sensor_start = 0; } /* 2nd. check file stream ending */ if ( ftell(pdo->p_fd_ps) - pdo->dip.prev_size <= PACK_HEADER_SIZE + PROGRAM_STREAM_MAP_SIZE + PES_PACKET_SIZE ) { return F_END; } return F_CONTI;}BOOL decoding_stream_filter(DEC_OBJECT *pdo){ STATE_DEC *psd; psd = &gp_state_thread->state_dec; if (psd->mode_rec == ALL) { // '0' All return TRUE; } else if (psd->mode_rec == CONTI) { // '1' Conti if (pdo->dip.conti) { return TRUE; } } else if (psd->mode_rec == MOTION) { // '2' Motion if (pdo->dip.motion) { return TRUE; } } else if (psd->mode_rec == SENSOR) { // '3' Sensor if (pdo->dip.sensor) { return TRUE; } } return FALSE;}RETURN read_data_from_hdd(DEC_OBJECT *pdo){ size_t size; if (pdo->dip.cur_size > DEC_MAX_BUF_SIZE) { printf("\t!!! [0x%x]:[0x%x] !!!\n", size, pdo->dip.cur_size); fflush(stdout); return FAILURE;} size = fread(pdo->p_demux_buf, sizeof(UNS8), pdo->dip.cur_size, pdo->p_fd_ps); fflush(pdo->p_fd_ps); if (size != pdo->dip.cur_size) { m_ERROR("pthread_dec.c:error In function 'fread'\n"); return FAILURE; } pdo->p_demux_buf[pdo->dip.cur_size/2+1] = ((pdo->play_mode & 0xff) << 2) | 0x01; // force to last flag 1 return SUCCESS;}RETURN feed_data_to_decoder(DEC_OBJECT *pdo){ UNS16 exit_play; UNS32 size, cur_size; exit_play = 0; /* xchannel-20050510@add-bug fix: when the split frame, processing */ cur_size = pdo->dip.cur_size; do { if (cur_size > DEC_MAX_BUF_SIZE) { /* 1st. read one frame hard disk */ size = fread(pdo->p_demux_buf, sizeof(UNS8), DEC_MAX_BUF_SIZE, pdo->p_fd_ps); fflush(pdo->p_fd_ps); if (size != DEC_MAX_BUF_SIZE) { m_ERROR("pthread_dec.c:error In function 'fread'\n"); return FAILURE; } pdo->p_demux_buf[DEC_MAX_BUF_SIZE/2+1] = ((pdo->play_mode & 0xff) << 2) | 0x00; // force to continue flag 0 /* 2nd. write to driver buffer */ decoding_stream_write(pdo->p_demux_buf, DEC_MAX_BUF_SIZE + RX_BUF_SIZE * 2); cur_size -= DEC_MAX_BUF_SIZE; } else { /* 1st. read one frame hard disk */ size = fread(pdo->p_demux_buf, sizeof(UNS8), cur_size, pdo->p_fd_ps); fflush(pdo->p_fd_ps); if (size != cur_size) { m_ERROR("pthread_dec.c:error In function 'fread'\n"); return FAILURE; } pdo->p_demux_buf[cur_size/2+1] = ((pdo->play_mode & 0xff) << 2) | 0x01; // force to last flag 1 /* 2nd. write to driver buffer */ decoding_stream_write(pdo->p_demux_buf, cur_size + RX_BUF_SIZE * 2); exit_play = 1; } } while (!exit_play); return SUCCESS;}RETURN get_picture_inform(DEC_OBJECT *pdo){ size_t size; /* 1st. read program stream map from file stream */ size = fread(&pdo->tpp, sizeof(S8), sizeof(PES_PACKET), pdo->p_fd_ps); fflush(pdo->p_fd_ps); if (size != sizeof(PES_PACKET)) { m_ERROR("pthread_dec.c:error In function 'fread'\n"); return FAILURE; } /* 2nd. return search file pointer to start picture */ fseek(pdo->p_fd_ps, ~ sizeof(PES_PACKET) + 1, SEEK_CUR); return SUCCESS;}BOOL fast_forward_stream_filter(DEC_OBJECT *pdo){ STATE_DEC *psd; psd = &gp_state_thread->state_dec; /* filterring for data type */ if (pdo->dip.data_type == DT_AUDIO) { return FALSE; } /* filterring Picture for type */#if 1 if (psd->play_step >= 1) { // x 2 if (pdo->dip.type == P_PICTURE) { return FALSE; } else if (pdo->dip.type == B_PICTURE) { return FALSE; } }#else if (psd->play_step == 1) { // x 2 if (pdo->dip.type == B_PICTURE) { return FALSE; } } else if (psd->play_step >= 2) { // x 4 if (pdo->dip.type == P_PICTURE) { return FALSE; } else if (pdo->dip.type == B_PICTURE) { return FALSE; } }#endif /* filterring Picture for decoding mode */ if (psd->mode_rec == ALL) { // '0' All return TRUE; } else if (psd->mode_rec == CONTI) { // '1' Conti if (pdo->dip.conti) { return TRUE; } } else if (psd->mode_rec == MOTION) { // '2' Motion if (pdo->dip.motion) { return TRUE; } } else if (psd->mode_rec == SENSOR) { // '3' Sensor if (pdo->dip.sensor) { return TRUE; } } return FALSE;}BOOL fast_backward_stream_filter(DEC_OBJECT *pdo){ STATE_DEC *psd; psd = &gp_state_thread->state_dec; /* filterring for data type */ if (pdo->dip.data_type == DT_AUDIO) { return FALSE; } /* filterring Picture for type */ if (psd->play_step >= 1) { // x 2 if (pdo->dip.type == P_PICTURE) { return FALSE; } else if (pdo->dip.type == B_PICTURE) { return FALSE; } } /* filterring Picture for decoding mode */ if (psd->mode_rec == ALL) { // '0' All return TRUE; } else if (psd->mode_rec == CONTI) { // '1' Conti if (pdo->dip.conti) { return TRUE; } } else if (psd->mode_rec == MOTION) { // '2' Motion if (pdo->dip.motion) { return TRUE; } } else if (psd->mode_rec == SENSOR) { // '3' Sensor if (pdo->dip.sensor) { return TRUE; } } return FALSE;}RETURN select_next_file(DEC_OBJECT *pdo){ S32 pt_cur; S32 pt_end; S8 str_tmp[40]; FILE *fd; size_t size; STATE_DEC *psd; STATE_DB *psdb; DB_RECORD db_t; S32 record_idx, ret; PTHREAD_BUF signal; psd = &gp_state_thread->state_dec; psdb = &gp_state_thread->state_db; /* 1st. play file close */ fclose(pdo->p_fd_ps); /* LOCK "MAIN_DB" file */ sem_wait(&psdb->search_sem); /* 2nd. open DB file */ if ( !(fd = fopen(MAIN_DB_NAME, "rb")) ) { m_ERROR("pthread_dec.c:error In function 'fopen'\n"); /* UNLOCK "MAIN_DB" file */ sem_post(&psdb->search_sem); return FAILURE; } record_idx = pdo->db_rec.next_db_fp / sizeof(DB_RECORD) - 1; /* When the storage space will be the full and db info is exchanged, corresponding record re-search */ while(1) { fseek(fd, sizeof(DB_RECORD) * record_idx, SEEK_SET); ret= fread(&db_t, sizeof(S8), sizeof(DB_RECORD), fd); if(ret < 0) { m_ERROR("#pthread_dec.c:error In function 'fread'\n"); fclose(fd); /* UNLOCK "MAIN_DB" file */ sem_post(&psdb->search_sem); return FAILURE; } else if ( ret == 0) { fclose(fd); /* UNLOCK "MAIN_DB" file */ sem_post(&psdb->search_sem); return ENDING; } if(strcmp(pdo->db_rec.fname, db_t.fname) < 0) record_idx--; else { record_idx++; break; } if (record_idx < 0) { record_idx = 0; break; } } /* 4rd. move DB file pointer to present play file */ fseek(fd, sizeof(DB_RECORD) * record_idx, SEEK_SET); pt_cur = ftell(fd); /* 4th. get main DB info */ fread(&pdo->db_rec, sizeof(UNS8), sizeof(DB_RECORD), fd); /* 5th. check search file end */ fseek(fd, 0, SEEK_END); pt_end = ftell(fd); m_DEBUG("\t!!! [cur>%#08x::end>%#08x]\n", pt_cur, pt_end); if (pt_cur >= pt_end) { /* 6th. close DB file */ fclose(fd); /* UNLOCK "MAIN_DB" file */ sem_post(&psdb->search_sem); return ENDING; } /* 6th. close DB file */ fclose(fd); /* UNLOCK "MAIN_DB" file */ sem_post(&psdb->search_sem); /* 7th. open play file stream */ if ( (pdo->p_fd_ps = fopen(pdo->db_rec.fname, "rb")) < 0 ) { m_ERROR("pthread_dec.c:error In function 'open'\n"); return FAILURE; } m_MSG("\t!!! OPEN: %s !!!\n", pdo->db_rec.fname); /* display to file name */ strcpy(psd->play_file, pdo->db_rec.fname); /* 8th. searching file end pointer */ fseek(pdo->p_fd_ps, 0, SEEK_END); pdo->end_fp = ftell(pdo->p_fd_ps); /* 9th. restore file pointer */ fseek(pdo->p_fd_ps, 0, SEEK_SET); /* 10th. read pack header from file stream */ size = fread(&pdo->tph, sizeof(S8), sizeof(PACK_HEADER), pdo->p_fd_ps); fflush(pdo->p_fd_ps); if (size != sizeof(PACK_HEADER)) { m_ERROR("pthread_dec.c:error In function 'fread'\n"); return FAILURE; } /* 11th. read program stream map from file stream */ size = fread(&pdo->tpsm, sizeof(S8), sizeof(PROGRAM_STREAM_MAP), pdo->p_fd_ps); fflush(pdo->p_fd_ps); if (size != sizeof(PROGRAM_STREAM_MAP)) { m_ERROR("pthread_dec.c:error In function 'fread'\n"); return FAILURE; } /* 12th. read PES packet from file stream */ size = fread(&pdo->tpp, sizeof(S8), sizeof(PES_PACKET), pdo->p_fd_ps); fflush(pdo->p_fd_ps); if (size != sizeof(PES_PACKET)) { m_ERROR("pthread_dec.c:error In function 'fread'\n"); return FAILURE; } /* 13th. search file pointer of start picture */ fseek(pdo->p_fd_ps, ~ sizeof(PES_PACKET) + 1, SEEK_CUR); /* 14th. signal send for auto view mode change */ signal.start_id = PTHREAD_DEC; signal.m_value = 3; if(pdo->db_rec.fname[24] == 'm') signal.m_channel = 4; else#if 1//big endian signal.m_channel = pdo->tpp.start_code & 0x0f; #else//little endian signal.m_channel = pdo->tpp.start_code & 0x0f; #endif if (pthread_send_signal(&signal, PTHREAD_LIVE) == FALSE) { m_ERROR("main.c:error: In function 'pthread_send_signal'\n"); } return SUCCESS;}RETURN select_previous_file(DEC_OBJECT *pdo){ S8 str_tmp[40]; FILE *fd; size_t size; STATE_DEC *psd; STATE_DB *psdb; DB_RECORD db_t; S32 record_idx, ret; PTHREAD_BUF signal; psd = &gp_state_thread->state_dec; psdb = &gp_state_thread->state_db; /* 1st. play file close */ fclose(pdo->p_fd_ps); /* 2nd. check backward playback end */ if (pdo->flag_global) { pdo->flag_global = 0; return ENDING; } /* LOCK "MAIN_DB" file */ sem_wait(&psdb->search_sem); /* 3rd. open DB file */ if ( !(fd = fopen(MAIN_DB_NAME, "rb")) ) { m_ERROR("pthread_dec.c:error In function 'fopen'\n"); /* UNLOCK "MAIN_DB" file */ sem_post(&psdb->search_sem); return FAILURE; } /* When the storage space will be the full and db info is exchanged, corresponding record re-search */ record_idx = pdo->db_rec.next_db_fp / sizeof(DB_RECORD) - 1; while(1) { fseek(fd, sizeof(DB_RECORD) * record_idx, SEEK_SET); ret = fread(&db_t, sizeof(S8), sizeof(DB_RECORD), fd); if( ret < 0) { m_ERROR("##pthread_dec.c:error In function 'fread'\n"); fclose(fd); /* UNLOCK "MAIN_DB" file */ sem_post(&psdb->search_sem); return FAILURE; } else if ( ret == 0) { fclose(fd); /* UNLOCK "MAIN_DB" file */ sem_post(&psdb->search_sem); return ENDING; } if(strcmp(pdo->db_rec.fname, db_t.fname) <= 0) record_idx--; else break; if (record_idx < 0) { pdo->flag_global = 1; fclose(fd); /* UNLOCK "MAIN_DB" file */ sem_post(&psdb->search_sem); return ENDING; } } /* 4rd. move DB file pointer to present play file */ fseek(fd, sizeof(DB_RECORD) * record_idx, SEEK_SET); /* 5th. get DB info */ fread(&pdo->db_rec, sizeof(UNS8), sizeof(DB_RECORD), fd); /* 6th. check search file start */ if (pdo->db_rec.next_db_fp == sizeof(DB_RECORD)) { pdo->flag_global = 1; } /* 7th. close DB file */ fclose(fd); /* UNLOCK "MAIN_DB" file */ sem_post(&psdb->search_sem); /* 8th. open play file stream */ if ( (pdo->p_fd_ps = fopen(pdo->db_rec.fname, "rb")) < 0 ) { m_ERROR("pthread_dec.c:error In function 'open'\n"); return FAILURE; } m_MSG("\t!!! OPEN: %s !!!\n", pdo->db_rec.fname); /* display to file name */ strcpy(psd->play_file, pdo->db_rec.fname); /* 9th. searching file end pointer */ fseek(pdo->p_fd_ps, 0, SEEK_END); pdo->end_fp = ftell(pdo->p_fd_ps); /* 10th. restore file pointer */ fseek(pdo->p_fd_ps, 0, SEEK_SET); /* 11th. move stream file pointer to present picture */ fseek(pdo->p_fd_ps, pdo->db_rec.end_fp, SEEK_SET); /* 12th. read PES packet from file stream */ size = fread(&pdo->tpp, sizeof(S8), sizeof(PES_PACKET), pdo->p_fd_ps); fflush(pdo->p_fd_ps); if (size != sizeof(PES_PACKET)) { m_ERROR("pthread_dec.c:error In function 'fread'\n"); return FAILURE; } /* 13th. search file pointer of start picture */ fseek(pdo->p_fd_ps, ~ sizeof(PES_PACKET) + 1, SEEK_CUR); /* 14th. signal send for auto view mode change */ signal.start_id = PTHREAD_DEC; signal.m_value = 3; if(pdo->db_rec.fname[24] == 'm') signal.m_channel = 4; else#if 1//big endian signal.m_channel = pdo->tpp.start_code & 0x0f; #else//little endian signal.m_channel = pdo->tpp.start_code & 0x0f; #endif if (pthread_send_signal(&signal, PTHREAD_LIVE) == FALSE) { m_ERROR("main.c:error: In function 'pthread_send_signal'\n"); } return SUCCESS;}/* end of pthread_dec.c */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -