doubao_chat/apps/wifi_camera/wifi/packet.c

1019 lines
30 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "packet.h"
#include "app_config.h"
#include "json_c/json.h"
#include "json_c/json_tokener.h"
#ifdef CONFIG_ENABLE_VLIST
int send_date_packet(struct __packet_info *pinfo, u32 msec);
int get_video_media_info(struct __packet_info *pinfo)
{
char buf[64];
u32 nlen = 0;
struct vfs_attr attr;
fget_attrs(pinfo->fd, &attr);
pinfo->time.tm_year = attr.crt_time.year;
pinfo->time.tm_mon = attr.crt_time.month;
pinfo->time.tm_mday = attr.crt_time.day;
pinfo->time.tm_hour = attr.crt_time.hour;
pinfo->time.tm_min = attr.crt_time.min;
pinfo->time.tm_sec = attr.crt_time.sec;
#if 0
printf("start=%d-%d-%d-%d-%d-%d\n"
, pinfo->time.tm_year
, pinfo->time.tm_mon
, pinfo->time.tm_mday
, pinfo->time.tm_hour
, pinfo->time.tm_min
, pinfo->time.tm_sec);
#endif
/*if (strstr(pinfo->file_name, get_rec_path_1())) {*/
/*fget_name(pinfo->fd, (u8 *)pinfo->file_name + strlen(get_rec_path_1()), 48);*/
/*} else if (strstr(pinfo->file_name, get_rec_path_2())) {*/
/*fget_name(pinfo->fd, (u8 *)pinfo->file_name + strlen(get_rec_path_2()), 48);*/
/*}*/
/*printf("pinfo->file_name=%s\n", pinfo->file_name); */
#ifdef CONFIG_NET_PKG_H264
read_time_scale_dur(pinfo->fd, &pinfo->info);
read_height_and_length(pinfo->fd, &pinfo->info);
read_stts(pinfo->fd, &pinfo->info);
pinfo->info.sample_rate = get_audio_sample_rate(pinfo->fd);
if (pinfo->info.sample_rate == -1) {
return -1;
}
if (is_has_audio(pinfo->fd)) {
u32 count = get_audio_sample_count(pinfo->fd);
if (count == -1) {
return -1;
}
pinfo->info.audio_chunk_num = get_audio_chunk_offset_entry(pinfo->fd);
if (pinfo->info.audio_chunk_num == -1) {
return -1;
}
pinfo->info.audio_block_size = (count * 2) / pinfo->info.audio_chunk_num;
/* printf("audio block size -> %d\n", pinfo->info.audio_block_size); */
/* printf("audio size -> %d\n", (count * 2) / pinfo->info.audio_chunk_num); */
pinfo->info.audio_stco_tab = get_audio_chunk_table(pinfo->fd, &pinfo->info);
if (pinfo->info.audio_stco_tab == NULL) {
return -1;
}
}
/* printf("weight:%d height :%d durition:%d \n", pinfo->info.length >> 16, pinfo->info.height >> 16, pinfo->info.durition / pinfo->info.scale); */
//get table
pinfo->info.stco_tab = get_chunk_index_table(pinfo->fd, &pinfo->info);
pinfo->info.stsz_tab = get_sample_index_table(pinfo->fd, &pinfo->info);
if (pinfo->info.stco_tab == NULL && pinfo->info.stsz_tab == NULL) {
printf(" pinfo->info.stco_tab == NULL\n\n");
return -1;
}
#endif
#ifdef CONFIG_NET_PKG_JPEG
pinfo->info.scale = 1;
pinfo->info.durition = avi_get_file_time(pinfo->fd, pinfo->state);
pinfo->info.sample_rate = avi_get_audio_sample_rate(pinfo->fd, pinfo->state);
pinfo->info.sample_duration = avi_get_fps(pinfo->fd, pinfo->state);
pinfo->info.video_sample_count = avi_get_video_chunk_num(pinfo->fd, pinfo->state);
pinfo->info.audio_chunk_num = avi_get_audio_chunk_num(pinfo->fd, pinfo->state);
avi_get_width_height(pinfo->fd, (void *)&pinfo->info, pinfo->state);
if (pinfo->info.sample_rate == -1) {
return -1;
}
#endif
return 0;
}
static int json_delet_backslash(char *str)
{
int len;
int i;
char tmp;
char *buff;
if (!str) {
return 0;
}
len = strlen(str);
if (!len) {
return 0;
}
buff = malloc(len + 1);
if (!buff) {
return 0;
}
memcpy(buff, str, len + 1);
for (i = 0; i < len; i++) {
tmp = buff[i];
if (tmp == '\\') {
memcpy(buff + i, buff + i + 1, len - i);
}
}
memset(str, '\0', len + 1);
memcpy(str, buff, len);
free(buff);
return len;
}
FILE *play_next(struct __packet_info *pinfo)
{
char name[64] = {0};
char tmp_name[64] = {0};
char *buf = NULL;
char *pbuf = NULL;
FILE *tmp_fd = NULL;
u8 invalid = 0;
json_object *new_obj;
json_object *list_obj;
json_object *array_obj;
json_object *f_obj;
json_object *t_obj;
char path[64] = {0};
char *pname = NULL;
FILE *fd = NULL;
int len;
int i = 0;
int pst = 0;
int cnt = 0;
int array_num = 0;
long long time;
long long lastfile_time = 0;
/************************************************************************************/
fget_name(pinfo->fd, (u8 *)name, sizeof(name));
fclose(pinfo->fd);
// FILE_GEN(NULL);
if (strstr(pinfo->file_name, get_rec_path_1())) {
sprintf(path, "%s%s", get_rec_path_1(), "vf_list.txt");
} else if (strstr(pinfo->file_name, get_rec_path_2())) {
sprintf(path, "%s%s", get_rec_path_2(), "vf_list.txt");
}
fd = fopen(path, "r");
if (!fd) {
return NULL;
}
len = flen(fd);
buf = malloc(len);
if (!buf) {
printf("no mem in video playback \n");
fclose(fd);
return NULL;
}
fread(buf, 1, len, fd);
fclose(fd);
new_obj = json_tokener_parse(buf);
if (!new_obj) {
free(buf);
return NULL;
}
list_obj = json_object_object_get(new_obj, "file_list");
if (!list_obj) {
json_object_put(new_obj);
free(buf);
return NULL;
}
array_num = json_object_array_length(list_obj);
printf("total_file_num : %d \n", array_num);
for (cnt = 0; cnt < 3; cnt++) {
for (i = pst ; i <= array_num; i++) {
array_obj = json_object_array_get_idx(list_obj, i);
if (array_obj) {
f_obj = json_object_object_get(array_obj, "f");
t_obj = json_object_object_get(array_obj, "t");
if (!cnt) {
if (!strstr(json_object_to_json_string(f_obj), name) || !t_obj) {
if (i >= array_num) {
goto exit;
}
continue;
}
/*printf("0file : %s \n",json_object_to_json_string(f_obj));*/
pbuf = json_object_to_json_string(t_obj) + 1;
lastfile_time = strtoll(pbuf, NULL, 10);
if (lastfile_time <= 0) {
continue;
}
pst = i;
break;
} else {
/*printf("1file : %s \n",json_object_to_json_string(f_obj));*/
#ifdef CONFIG_NET_PKG_H264
if ((!strstr(json_object_to_json_string(f_obj), ".MOV") && !strstr(json_object_to_json_string(f_obj), ".mov")) || !t_obj)
#endif
#ifdef CONFIG_NET_PKG_JPEG
if ((!strstr(json_object_to_json_string(f_obj), ".AVI") && !strstr(json_object_to_json_string(f_obj), ".avi")) || !t_obj)
#endif
{
continue;
}
pbuf = json_object_to_json_string(t_obj) + 1;
time = strtoll(pbuf, NULL, 10);
if (time > lastfile_time) {
pbuf = json_object_to_json_string(f_obj);
len = json_delet_backslash(pbuf);
if (!len) {
printf("len err \n");
goto exit;
}
len = strlen(pbuf);
memcpy(tmp_name, pbuf + 1, len - 2);
lastfile_time = time;
pname = tmp_name;
goto exit;
}
if (i >= (array_num - 1)) {
pst = 0;
}
}
}
}
}
exit:
json_object_put(new_obj);
free(buf);
if (!pname) {
printf("no file !!\n");
return NULL;
}
tmp_fd = fopen(pname, "r");
if (!tmp_fd) {
printf("open file err !!!! %s\n", pname);
return NULL;
}
#ifdef CONFIG_NET_PKG_H264
if (!is_vaild_mov_file(tmp_fd)) {
puts("invalid mov file\n");
fclose(tmp_fd);
return NULL;
}
#endif
#ifdef CONFIG_NET_JPEG
avi_net_playback_unpkg_init(tmp_fd, pinfo->state);
if (!is_vaild_avi_file(tmp_fd, pinfo->state)) {
puts("invalid video file\n");
fclose(tmp_fd);
return NULL;
}
#endif
strcpy(pinfo->file_name, pname);
printf("play next file : %s\n", pinfo->file_name);
return tmp_fd;
/************************************************************************************/
#if 0
fget_name(pinfo->fd, (u8 *)name, sizeof(name));
#ifdef CONFIG_EMR_REC_DIR
if (strstr(pinfo->file_name, get_rec_path_1()) && strstr(pinfo->file_name, CONFIG_EMR_REC_DIR)) {
pinfo->fs = fscan(strcat(get_rec_path_1(), CONFIG_EMR_REC_DIR), "-tMOVAVI -st");
} else if (strstr(pinfo->file_name, get_rec_path_2()) && strstr(pinfo->file_name, CONFIG_EMR_REC_DIR)) {
pinfo->fs = fscan(strcat(get_rec_path_2(), CONFIG_EMR_REC_DIR), "-tMOVAVI -st");
} else
#endif
if (strstr(pinfo->file_name, get_rec_path_1())) {
pinfo->fs = fscan(get_rec_path_1(), "-tMOVAVI -st");
} else if (strstr(pinfo->file_name, get_rec_path_2())) {
pinfo->fs = fscan(get_rec_path_2(), "-tMOVAVI -st");
}
#ifdef CONFIG_NET_JPEG
avi_net_unpkg_exit(pinfo->fd, pinfo->state);
#endif
printf("netx video : name-> %s \n", name);
fclose(pinfo->fd);
while (1) {
if (tmp_fd == NULL) {
tmp_fd = fselect(pinfo->fs, FSEL_FIRST_FILE, 0);
} else {
tmp_fd = fselect(pinfo->fs, FSEL_NEXT_FILE, 0);
}
if (tmp_fd == NULL) {
break;
}
fget_name(tmp_fd, (u8 *)tmp_name, sizeof(tmp_name));
/*printf("tmp_name->%s name->%s\n", tmp_name, name);*/
if (!strcmp(tmp_name, name) && !invalid) {
if (tmp_fd != NULL) {
fclose(tmp_fd);
}
tmp_fd = fselect(pinfo->fs, FSEL_NEXT_FILE, 0);
if (tmp_fd == NULL) {
break;
}
#ifdef CONFIG_NET_PKG_H264
if (!is_vaild_mov_file(tmp_fd)) {
puts("invalid mov file\n");
invalid = 1;
fclose(tmp_fd);
continue;
}
#endif
#ifdef CONFIG_NET_JPEG
avi_net_playback_unpkg_init(tmp_fd, pinfo->state);
if (!is_vaild_avi_file(tmp_fd, pinfo->state)) {
puts("invalid video file\n");
invalid = 1;
fclose(tmp_fd);
continue;
}
#endif
break;
}
if (invalid) {
tmp_fd = fselect(pinfo->fs, FSEL_NEXT_FILE, 0);
if (tmp_fd == NULL) {
break;
} else {
fclose(tmp_fd);
}
#ifdef CONFIG_NET_PKG_H264
if (!is_vaild_mov_file(tmp_fd)) {
puts("invalid mov file\n");
invalid = 1;
fclose(tmp_fd);
continue;
}
#endif
#ifdef CONFIG_NET_JPEG
avi_net_playback_unpkg_init(tmp_fd, pinfo->state);
if (!is_vaild_avi_file(tmp_fd, pinfo->state)) {
puts("invalid video file\n");
invalid = 1;
fclose(tmp_fd);
continue;
}
#endif
break;
}
fclose(tmp_fd);
}
fget_name(tmp_fd, (u8 *)tmp_name, sizeof(tmp_name));
printf("play next file : %s\n", tmp_name);
fscan_release(pinfo->fs);
#endif
return tmp_fd;
}
FILE *play_prev(struct __packet_info *pinfo)
{
//#define CONFIG_REC_PATH_1 CONFIG_STORAGE_PATH"/C/DCIM/1/"
char name[32];
char tmp_name[32];
FILE *tmp_fd = NULL;
#ifdef CONFIG_NET_PKG_H264
u32 invalid = 0;
fget_name(pinfo->fd, (u8 *)name, 32);
if (strstr(pinfo->file_name, get_rec_path_1())) {
pinfo->fs = fscan(get_rec_path_1(), "-tMOV -st");
} else if (strstr(pinfo->file_name, get_rec_path_2())) {
pinfo->fs = fscan(get_rec_path_2(), "-tMOV -st");
}
fclose(pinfo->fd);
while (1) {
if (tmp_fd == NULL) {
tmp_fd = fselect(pinfo->fs, FSEL_LAST_FILE, 0);
} else {
tmp_fd = fselect(pinfo->fs, FSEL_PREV_FILE, 0);
}
if (tmp_fd == NULL) {
break;
}
fget_name(tmp_fd, (u8 *)tmp_name, 32);
/* printf("tmp_name -> %s \n", tmp_name); */
if (!strcmp(tmp_name, name) && !invalid) {
tmp_fd = fselect(pinfo->fs, FSEL_PREV_FILE, 0);
if (tmp_fd == NULL) {
break;
}
if (!is_vaild_mov_file(tmp_fd)) {
fclose(tmp_fd);
continue;
}
break;
}
if (invalid) {
tmp_fd = fselect(pinfo->fs, FSEL_NEXT_FILE, 0);
if (tmp_fd == NULL) {
break;
}
if (!is_vaild_mov_file(tmp_fd)) {
puts("invalid mov file\n");
invalid = 1;
continue;
}
break;
}
fclose(tmp_fd);
}
fscan_release(pinfo->fs);
#endif
return tmp_fd;
}
int send_video_packet(struct __packet_info *pinfo, u32 i)
{
int ret;
u32 tmp ;
char *buffer = NULL;
u32 tmp2;
u32 start_code = 0x01000000;
u32 send_len = 0;
int flen;
struct frm_head *frame_head = (struct frm_head *)pinfo->data;
memset(frame_head, 0, sizeof(struct frm_head));
#ifdef CONFIG_NET_PKG_H264
int sample_size = get_sample_size(pinfo->info.stsz_tab, i);
if (sample_size == -1) {
return -1;
}
int sample_offset = get_chunk_offset(pinfo->info.stco_tab, i);
if (sample_offset == -1) {
return -1;
}
if (sample_size > pinfo->len) {
printf("I frame size:0x%x offset:0x%x buffer size:%d\n", sample_size, sample_offset, pinfo->len);
ASSERT(!(sample_size > pinfo->len), "I frame is too large");
}
fseek(pinfo->fd, sample_offset, SEEK_SET);
frame_head->type = pinfo->type ;//| pinfo->fast_play_mask;
// frame_head->type = H264_TYPE_VIDEO;
frame_head->seq = i;
/* printf("video seq=%d\n", frame_head->seq); */
frame_head->timestamp = 90000 / (pinfo->info.scale / pinfo->info.sample_duration);
ret = fread(pinfo->fd, pinfo->data + sizeof(struct frm_head), sample_size);
if (ret <= 0) {
return ret;
}
frame_head->frm_sz = ret;
buffer = (char *)pinfo->data + sizeof(struct frm_head);
if (*((char *)(buffer + 4)) == 0x67) {
//处理PPS帧和SPS帧 I帧
memcpy(&tmp, buffer, 4);
tmp = htonl(tmp);
memcpy(buffer, &start_code, 4);
memcpy(&tmp2, buffer + tmp + 4, 4);
tmp2 = htonl(tmp2);
memcpy(buffer + tmp + 4, &start_code, 4);
memcpy(buffer + tmp + tmp2 + 8, &start_code, 4);
//printf("tmp %d tmp2 %d\n",tmp,tmp2);
//printf("&&&&&& video-I seq = %d\n",i);
} else {
// 处理P帧
memcpy(buffer, &start_code, 4);
}
ret = sock_send(pinfo->sock, (char *)pinfo->data, ret + sizeof(struct frm_head), 0);
return ret;
#endif
#ifdef CONFIG_NET_PKG_JPEG
/*frame_head->type = PREVIEW_TYPE;*/
frame_head->type = pinfo->type;// | pinfo->fast_play_mask;
frame_head->seq = i;
/* printf("video seq=%d\n", frame_head->seq); */
frame_head->timestamp = 90000 / avi_get_fps(pinfo->fd, pinfo->state);
#if 0
flen = avi_video_set_frame_addr(pinfo->fd, frame_head->seq + 1, pinfo->state);
if (flen <= 0) {
return flen;
}
frame_head->frm_sz = flen;
ret = sock_send(pinfo->sock, (char *)pinfo->data, sizeof(struct frm_head), 0);
if (ret <= 0) {
return ret;
}
while (flen > 0) {
ret = fread(pinfo->fd, pinfo->data, MIN(flen, IMAGE_SIZE));
if (ret <= 0) {
return ret;
}
flen -= ret;
ret = sock_send(pinfo->sock, (char *)pinfo->data, ret, 0);
if (ret <= 0) {
return ret;
}
send_len += ret;
}
return send_len;
#else
/*printf("get video frame...\n");*/
pinfo->data_len = pinfo->len - sizeof(struct frm_head);
flen = avi_video_get_frame(pinfo->fd, frame_head->seq + 1, pinfo->data + sizeof(struct frm_head), pinfo->data_len, pinfo->state);
if (flen <= 0) {
return flen;
}
if (!pinfo->state) {
printf("get video frame ok...\n");
}
frame_head->frm_sz = flen;
ret = sock_send(pinfo->sock, (char *)pinfo->data, flen + sizeof(struct frm_head), 0);
return ret;
#endif
#endif
return ret;
}
int send_audio_packet(struct __packet_info *pinfo, u32 j)
{
int ret;
static u32 tmp = 0;
static u32 tmp2 = 0;
struct frm_head *frame_head = (struct frm_head *)pinfo->data;
#ifdef CONFIG_NET_PKG_H264
int audio_offset = get_audio_chunk_offset(pinfo->info.audio_stco_tab, j);
if (audio_offset == -1) {
return -1;
}
if (false == fseek(pinfo->fd, audio_offset, SEEK_SET)) {
return -1;
}
tmp = frame_head->seq;
frame_head->type = PCM_TYPE_AUDIO;
frame_head->frm_sz = pinfo->info.audio_block_size;
ret = fread(pinfo->fd, pinfo->data + sizeof(struct frm_head), pinfo->info.audio_block_size);
if (ret <= 0) {
return ret;
}
ret = sock_send(pinfo->sock, (char *)pinfo->data, ret + sizeof(struct frm_head), 0);
tmp2++;
if (tmp2 == pinfo->info.audio_chunk_num) {
tmp = 0;
}
#endif
#ifdef CONFIG_NET_JPEG
pinfo->data_len = pinfo->len - sizeof(struct frm_head);
ret = avi_audio_get_frame(pinfo->fd, j + 1, pinfo->data + sizeof(struct frm_head), pinfo->data_len, pinfo->state);
if (ret <= 0) {
return ret;
}
pinfo->info.audio_block_size = ret;
frame_head->type = PCM_TYPE_AUDIO;
frame_head->frm_sz = pinfo->info.audio_block_size;
ret = sock_send(pinfo->sock, (char *)pinfo->data, ret + sizeof(struct frm_head), 0);
#endif
return ret;
}
void incr_date_time(struct tm *tm_time, int incr)
{
do {
if (incr >= 60) {
tm_time->tm_sec += 60;
incr -= 60;
} else {
tm_time->tm_sec += incr;
incr = 0;
}
if (tm_time->tm_sec > 59) {
tm_time->tm_sec -= 60;
tm_time->tm_min += 1;
if (tm_time->tm_min > 59) {
tm_time->tm_min -= 60;
tm_time->tm_hour += 1;
if (tm_time->tm_hour > 23) {
tm_time->tm_hour -= 24;
tm_time->tm_mday += 1;
if (tm_time->tm_mday > cal_days(tm_time->tm_year, tm_time->tm_mon)) {
tm_time->tm_mday = 1;
tm_time->tm_mon += 1;
if (tm_time->tm_mon > 12) {
tm_time->tm_mon = 1;
++tm_time->tm_year;
}
}
}
}
}
} while (incr);
}
u32 conver_date_time(struct tm *tm_time)
{
u32 date_time;
date_time = tm_time->tm_sec;
date_time |= tm_time->tm_min << 6;
date_time |= tm_time->tm_hour << 12;
date_time |= tm_time->tm_mday << 17;
date_time |= tm_time->tm_mon << 22;
date_time |= (tm_time->tm_year - 2015) << 26;
return date_time;
}
int send_media_packet(struct __packet_info *pinfo)
{
/* puts("send_media_packet\n"); */
int ret = 0;
char name[32] = {0};
struct frm_head *frame_head = (struct frm_head *)pinfo->data;
memset(frame_head, 0, sizeof(struct frm_head) + sizeof(struct media_info));
//send media info packet
frame_head->type = MEDIA_INFO_TYPE;
frame_head->seq = 0;
struct media_info *media = (struct media_info *)(pinfo->data + sizeof(struct frm_head));
#ifdef CONFIG_NET_PKG_H264
media->length = pinfo->info.length >> 16;
media->height = pinfo->info.height >> 16;
media->fps = pinfo->info.scale / pinfo->info.sample_duration;
#endif
#ifdef CONFIG_NET_PKG_JPEG
media->length = pinfo->info.length;
media->height = pinfo->info.height;
media->fps = pinfo->info.sample_duration;
#endif
media->audio_rate = pinfo->info.sample_rate;
media->dur_time = pinfo->info.durition / pinfo->info.scale;
/* printf("fps = %d\n",media->fps); */
/*printf("=====media->dur_time=%d\n", media->dur_time);*/
strcpy(media->filename, pinfo->file_name);
/* strcpy(pinfo->data + sizeof(struct frm_head) + sizeof(struct media_info),pinfo->file_name); */
size_t len = sizeof(struct frm_head) + sizeof(struct media_info) + strlen(pinfo->file_name);
frame_head->frm_sz = len - sizeof(struct frm_head);
ret = sock_send(pinfo->sock, (char *)pinfo->data, len, 0);
if (ret <= 0) {
return ret;
}
ret = send_date_packet(pinfo, 0);//发送起始时间包
return ret;
}
int send_date_packet(struct __packet_info *pinfo, u32 msec)
{
int ret = 0;
u32 date = 0;
struct tm tm_time;
#if (defined CONFIG_NET_PKG_H264 || defined CONFIG_NET_PKG_JPEG)
struct frm_head *frame_head = (struct frm_head *)pinfo->data;
frame_head->type = DATE_TIME_TYPE;
frame_head->frm_sz = 4;
incr_date_time(&pinfo->time, msec);
date = conver_date_time(&pinfo->time);
if (!msec) {
printf("file start timer : %d-%d-%d-%d-%d-%d\n"
, pinfo->time.tm_year
, pinfo->time.tm_mon
, pinfo->time.tm_mday
, pinfo->time.tm_hour
, pinfo->time.tm_min
, pinfo->time.tm_sec);
} else {
#if 1
printf("xdt=%d-%d-%d-%d-%d-%d\n"
, pinfo->time.tm_year
, pinfo->time.tm_mon
, pinfo->time.tm_mday
, pinfo->time.tm_hour
, pinfo->time.tm_min
, pinfo->time.tm_sec);
#endif
}
memcpy(pinfo->data + sizeof(struct frm_head), &date, frame_head->frm_sz);
ret = sock_send(pinfo->sock, (char *)pinfo->data, sizeof(struct frm_head) + 4, 0);
#endif
return ret;
}
int send_end_packet(struct __packet_info *pinfo)
{
puts("send_end_packet\n");
int ret = 0;
struct frm_head *frame_head = (struct frm_head *)pinfo->data;
memset(frame_head, 0, sizeof(struct frm_head));
#if (defined CONFIG_NET_PKG_H264 || defined CONFIG_NET_PKG_JPEG)
if (pinfo->fd == NULL) {
puts("PLAY_OVER_TYPE | LAST_FREG_MAKER\n");
frame_head->type = (PLAY_OVER_TYPE | LAST_FREG_MAKER);
} else {
puts("PLAY_OVER_TYPE\n");
frame_head->type = PLAY_OVER_TYPE;
}
ret = sock_send(pinfo->sock, (char *)pinfo->data, sizeof(struct frm_head), 0);
#endif
return ret;
}
int update_data(struct __packet_info *pinfo)
{
if (pinfo->info.stco_tab != NULL) {
free(pinfo->info.stco_tab);
pinfo->info.stco_tab = NULL;
}
if (pinfo->info.stsz_tab != NULL) {
free(pinfo->info.stsz_tab);
pinfo->info.stsz_tab = NULL;
}
if (pinfo->info.audio_stco_tab != NULL) {
free(pinfo->info.audio_stco_tab);
pinfo->info.audio_stco_tab = NULL;
}
#if 0
if (pinfo->fd != NULL) {
fclose(pinfo->fd);
pinfo->fd = NULL;
}
#endif
return get_video_media_info(pinfo);
}
#if 0
/*********************************GPS*************************************/
#define MOV_GPS_BUF_LEN 60*10*512
#define MOV_FILE_GPS_HEAD_ADDR 0X70
static int gps_data_addr = 0;//GPS文件地址
static int gps_data_len = 0;//GPS数据长度
static short gps_packet_seq = 0;//GPS数据包SEQ
static u8 *gps_data_buf = NULL;//RAM GPS数据地址
static int last_sec = 0; //用在快进
#define GPS_ERROR() {printf("\nerror : func : %s line %d \n\n",__func__,__LINE__);return -1;}
static int gps_get_data(char *src, int src_len, char *buf, int buf_len)
{
static int addr = 0;
int len = 0;
char *pstart, *pend, *pbuf;
addr = gps_data_addr;
if (addr >= src_len) {
addr = 0;
return -1;
}
pend = src + addr;
pstart = strstr(pend, "$GPRMC");
if (pstart) {
pend = strstr(pstart, "\r\n");
if (pend) {
pbuf = strstr(pend, "$GPGGA");
if (pbuf) {
pbuf = strstr(pbuf + strlen("\r\n"), "\r\n");
}
if (pbuf) {
pend = pbuf;
}
len = pend - pstart + strlen("\r\n");
pbuf = strstr(pend, "$GPGSA");
if (pbuf) {
pbuf = strstr(pbuf + strlen("\r\n"), "\r\n");
}
if (pbuf) {
pend = pbuf;
}
len = pend - pstart + strlen("\r\n");
if (buf_len < len) {
len = 0;
goto exit;
}
memcpy(buf, pstart, len);
}
}
exit:
return len;
}
static int send_no_gps_media(struct __packet_info *pinfo)
{
int ret = 0;
int len = 0;
char buf[32] = "NO GPS DATA\r\n";
struct frm_head *frame_head = (struct frm_head *)pinfo->data;
len = strlen(buf);
frame_head->type = NO_GPS_DATA_TYPE;
frame_head->frm_sz = len;
frame_head->seq = 0;
memcpy(pinfo->data + sizeof(struct frm_head), buf, len);
printf("%s\n", buf);
ret = sock_send(pinfo->sock, pinfo->data, sizeof(struct frm_head) + len, 0);
if (ret != sizeof(struct frm_head) + len) {
printf("gps media send err!!!\n\n");
return ret;
}
return 0;
}
//data_len:<0无数据,>0有数据
static int send_gps_media(struct __packet_info *pinfo, int data_len)
{
int ret = 0;
int len = 0;
char buf[32] = "GPS DATA\r\n";
struct frm_head *frame_head = (struct frm_head *)pinfo->data;
if (data_len > 0) {
len = strlen(buf);
frame_head->type = GPS_INFO_TYPE;
frame_head->frm_sz = len;
frame_head->seq = 0;
memcpy(pinfo->data + sizeof(struct frm_head), buf, len);
ret = sock_send(pinfo->sock, pinfo->data, sizeof(struct frm_head) + len, 0);
if (ret != sizeof(struct frm_head) + len) {
printf("gps media send err!!!\n\n");
return ret;
}
} else {
frame_head->type = GPS_INFO_TYPE;
frame_head->frm_sz = 0;
frame_head->seq = 0;
ret = sock_send(pinfo->sock, pinfo->data, sizeof(struct frm_head), 0);
if (ret != sizeof(struct frm_head)) {
printf("gps media send err!!!\n\n");
return ret;
}
}
return 0;
}
int find_gps_data(struct __packet_info *pinfo)
{
int current_addr;
int err;
last_sec = 0;
if (pinfo->fd == NULL) {
GPS_ERROR();
}
if (fseek(pinfo->fd, MOV_FILE_GPS_HEAD_ADDR, SEEK_SET) == FALSE) {
GPS_ERROR();
}
if (fread(pinfo->fd, &gps_data_addr, sizeof(gps_data_addr)) != sizeof(gps_data_addr)) {
GPS_ERROR();
}
gps_data_addr = ntohl(gps_data_addr);
if (gps_data_addr == 0) {
fseek(pinfo->fd, 0, SEEK_SET);
send_no_gps_media(pinfo);
return -1;
}
if (fseek(pinfo->fd, gps_data_addr, SEEK_SET) == FALSE) {
GPS_ERROR();
}
if (fread(pinfo->fd, &gps_data_len, sizeof(gps_data_len)) != sizeof(gps_data_len)) {
GPS_ERROR();
}
gps_data_len = ntohl(gps_data_len);
if (gps_data_len == 0) {
fseek(pinfo->fd, 0, SEEK_SET);
send_no_gps_media(pinfo);
return -1;
}
if (gps_data_buf == NULL) {
gps_data_buf = malloc(MOV_GPS_BUF_LEN);
if (!gps_data_buf) {
fseek(pinfo->fd, 0, SEEK_SET);
GPS_ERROR();
}
memset(gps_data_buf, 0, MOV_GPS_BUF_LEN);
} else {
memset(gps_data_buf, 0, MOV_GPS_BUF_LEN);
}
err = fread(pinfo->fd, gps_data_buf, gps_data_len);
if (err != gps_data_len) {
fseek(pinfo->fd, 0, SEEK_SET);
GPS_ERROR();
}
gps_data_addr = 0;
gps_packet_seq = 0;
if (fseek(pinfo->fd, 0, SEEK_SET) == FALSE) {
GPS_ERROR();
}
printf("MOV GPS data find succes\n\n");
return 0;
}
int send_gps_data_packet(struct __packet_info *pinfo)
{
int ret;
int i;
int len;
int current_addr;
int timer;
char fast_mode;
char send_buf[512] = {0};
struct frm_head *frame_head = (struct frm_head *)pinfo->data;
if (frame_head == NULL || gps_data_len == 0) {
/*printf("gps head or data len 0 !!!\n\n");*/
return -1;
}
timer = pinfo->time.tm_hour * 3600 + pinfo->time.tm_min * 60 + pinfo->time.tm_sec;
if (!last_sec) {
fast_mode = 1;
last_sec = timer;
} else {
fast_mode = timer - last_sec;
last_sec = timer;
}
for (; fast_mode >= 1; fast_mode--) {
len = gps_get_data(gps_data_buf, gps_data_len, send_buf, sizeof(send_buf));
if (len <= 0) {
if (len < 0) {
printf("GPS data read end \n");
} else {
printf("GPS data read err \n");
}
return -1;
}
gps_data_addr += len;
gps_packet_seq++;
frame_head->type = GPS_INFO_TYPE;
frame_head->frm_sz = len;
frame_head->seq = gps_packet_seq;
memcpy(pinfo->data + sizeof(struct frm_head), send_buf, len);
ret = sock_send(pinfo->sock, pinfo->data, sizeof(struct frm_head) + len, 0);
if (ret != (sizeof(struct frm_head) + len)) {
printf("gps data send err !!!\n\n");
return ret;
}
}
printf("MOV GPS data send succes , len : %d \n\n", len);
return ret;
}
int unfind_gps_data(void)
{
if (gps_data_buf != NULL) {
free(gps_data_buf);
}
gps_data_buf = NULL;
gps_data_len = 0;
gps_data_addr = 0;
gps_packet_seq = 0;
return 0;
}
/******************************************************************/
#endif
#endif