?? multplex.c
字號:
queue_buffer (buffer, *bytes_left, &video_au->DTS);
video_au->length -= *bytes_left;
*picture_start = FALSE;
} else
if (video_au->length == *bytes_left)
{
queue_buffer (buffer, *bytes_left, &video_au->DTS);
#ifdef TIMER
gettimeofday (&tp_start,NULL);
#endif
i=fread (video_au, sizeof(Vaunit_struc), 1, vunits_info);
#ifdef TIMER
gettimeofday (&tp_end,NULL);
total_sec += (tp_end.tv_sec - tp_start.tv_sec);
total_usec += (tp_end.tv_usec - tp_start.tv_usec);
#endif
if (i != 1)
{
empty_vaunit_struc (video_au);
//status_message(STATUS_VIDEO_END);
return;
}
*picture_start = TRUE;
add_to_timecode (SCR_delay, &video_au->DTS);
add_to_timecode (SCR_delay, &video_au->PTS);
};
}
/******************************************************************
Output_Video
從視頻流中產生Pack/Sys_Header/Packet信息
******************************************************************/
void output_video (SCR, SCR_delay, vunits_info, istream_v, ostream,
pack, sys_header, sector, buffer, video_au,
picture_start, bytes_output, mux_rate,
audio_buffer_size, video_buffer_size,
packet_data_size, marker_pack, which_streams)
Timecode_struc *SCR;
Timecode_struc *SCR_delay;
FILE *vunits_info;
FILE *istream_v;
FILE *ostream;
Pack_struc *pack;
Sys_header_struc *sys_header;
Sector_struc *sector;
Buffer_struc *buffer;
Vaunit_struc *video_au;
unsigned char *picture_start;
unsigned int *bytes_output;
unsigned int mux_rate;
unsigned long audio_buffer_size;
unsigned long video_buffer_size;
unsigned long packet_data_size;
unsigned char marker_pack;
unsigned int which_streams;
{
unsigned int bytes_left;
unsigned int temp;
Pack_struc *pack_ptr;
Sys_header_struc *sys_header_ptr;
unsigned char timestamps;
if (marker_pack)
{
create_pack (pack, SCR, mux_rate);
create_sys_header (sys_header, mux_rate, 1, 1, 1, 1, 1, 1,
AUDIO_STR_0, 0, audio_buffer_size/128,
VIDEO_STR_0, 1, video_buffer_size/1024, which_streams );
pack_ptr = pack;
sys_header_ptr = sys_header;
} else
{
pack_ptr = NULL;
sys_header_ptr = NULL;
}
if (*picture_start)
{
if (video_au->type == BFRAME)
timestamps=TIMESTAMPS_PTS;
else
timestamps=TIMESTAMPS_PTS_DTS;
create_sector (sector, pack_ptr, sys_header_ptr,
packet_data_size+PACKET_HEADER_SIZE+AFTER_PACKET_LENGTH,
istream_v, VIDEO_STR_0, 1, video_buffer_size/1024,
TRUE, &video_au->PTS, &video_au->DTS,
timestamps, which_streams );
bytes_left = sector->length_of_packet_data;
next_video_access_unit (buffer, video_au, &bytes_left, vunits_info,
picture_start, SCR_delay);
}
else if (!(*picture_start) && (video_au->length >= packet_data_size))
{
create_sector (sector, pack_ptr, sys_header_ptr,
packet_data_size+PACKET_HEADER_SIZE+AFTER_PACKET_LENGTH,
istream_v, VIDEO_STR_0, 1, video_buffer_size/1024,
TRUE, NULL, NULL,
TIMESTAMPS_NO, which_streams );
bytes_left = sector->length_of_packet_data;
next_video_access_unit (buffer, video_au, &bytes_left, vunits_info,
picture_start, SCR_delay);
}
else if (!(*picture_start) && (video_au->length < packet_data_size))
{
temp = video_au->length;
queue_buffer (buffer, video_au->length, &video_au->DTS);
#ifdef TIMER
gettimeofday (&tp_start,NULL);
#endif
if (fread (video_au, sizeof(Vaunit_struc), 1, vunits_info)==1)
{
if (video_au->type == BFRAME)
timestamps=TIMESTAMPS_PTS;
else
timestamps=TIMESTAMPS_PTS_DTS;
*picture_start = TRUE;
add_to_timecode (SCR_delay, &video_au->DTS);
add_to_timecode (SCR_delay, &video_au->PTS);
create_sector (sector, pack_ptr, sys_header_ptr,
packet_data_size+PACKET_HEADER_SIZE+AFTER_PACKET_LENGTH,
istream_v, VIDEO_STR_0, 1, video_buffer_size/1024,
TRUE, &video_au->PTS, &video_au->DTS,
timestamps, which_streams );
bytes_left = sector->length_of_packet_data - temp;
next_video_access_unit (buffer, video_au, &bytes_left, vunits_info,
picture_start, SCR_delay);
} else
{
empty_vaunit_struc (video_au);
create_sector (sector, pack_ptr, sys_header_ptr,
packet_data_size+PACKET_HEADER_SIZE+AFTER_PACKET_LENGTH,
istream_v, VIDEO_STR_0, 1, video_buffer_size/1024,
TRUE, NULL, NULL,
TIMESTAMPS_NO, which_streams );
};
#ifdef TIMER
gettimeofday (&tp_end,NULL);
total_sec += (tp_end.tv_sec - tp_start.tv_sec);
total_usec += (tp_end.tv_usec - tp_start.tv_usec);
#endif
}
#ifdef TIMER
gettimeofday (&tp_start,NULL);
#endif
fwrite (sector->buf, sector->length_of_sector, 1, ostream);
#ifdef TIMER
gettimeofday (&tp_end,NULL);
total_sec += (tp_end.tv_sec - tp_start.tv_sec);
total_usec += (tp_end.tv_usec - tp_start.tv_usec);
#endif
*bytes_output += sector->length_of_sector;
}
/******************************************************************
Next_Audio_Access_Unit
從臨時文件中獲取存儲單元的信息
******************************************************************/
void next_audio_access_unit (buffer, audio_au, bytes_left, aunits_info,
audio_frame_start, SCR_delay)
Buffer_struc *buffer;
Aaunit_struc *audio_au;
unsigned int *bytes_left;
FILE *aunits_info;
unsigned char *audio_frame_start;
Timecode_struc *SCR_delay;
{
int i;
if (*bytes_left == 0)
return;
while (audio_au->length < *bytes_left)
{
queue_buffer (buffer, audio_au->length, &audio_au->PTS);
*bytes_left -= audio_au->length;
#ifdef TIMER
gettimeofday (&tp_start,NULL);
#endif
i=fread (audio_au, sizeof(Aaunit_struc), 1, aunits_info);
#ifdef TIMER
gettimeofday (&tp_end,NULL);
total_sec += (tp_end.tv_sec - tp_start.tv_sec);
total_usec += (tp_end.tv_usec - tp_start.tv_usec);
#endif
if (i != 1)
{
empty_aaunit_struc (audio_au);
//status_message(STATUS_AUDIO_END);
return;
}
*audio_frame_start = TRUE;
add_to_timecode (SCR_delay, &audio_au->PTS);
};
if (audio_au->length > *bytes_left)
{
queue_buffer (buffer, *bytes_left, &audio_au->PTS);
audio_au->length -= *bytes_left;
*audio_frame_start = FALSE;
} else
if (audio_au->length == *bytes_left)
{
queue_buffer (buffer, *bytes_left, &audio_au->PTS);
#ifdef TIMER
gettimeofday (&tp_start,NULL);
#endif
i=fread (audio_au, sizeof(Aaunit_struc), 1, aunits_info);
#ifdef TIMER
gettimeofday (&tp_end,NULL);
total_sec += (tp_end.tv_sec - tp_start.tv_sec);
total_usec += (tp_end.tv_usec - tp_start.tv_usec);
#endif
if (i != 1)
{
empty_aaunit_struc (audio_au);
//status_message(STATUS_AUDIO_END);
return;
}
*audio_frame_start = TRUE;
add_to_timecode (SCR_delay, &audio_au->PTS);
};
}
/******************************************************************
Output_Audio
從音頻流中獲取Pack/Sys Header/Packet信息
******************************************************************/
void output_audio (SCR, SCR_delay, aunits_info, istream_a, ostream,
pack, sys_header, sector, buffer, audio_au,
audio_frame_start, bytes_output, mux_rate,
audio_buffer_size, video_buffer_size,
packet_data_size, marker_pack, which_streams)
Timecode_struc *SCR;
Timecode_struc *SCR_delay;
FILE *aunits_info;
FILE *istream_a;
FILE *ostream;
Pack_struc *pack;
Sys_header_struc *sys_header;
Sector_struc *sector;
Buffer_struc *buffer;
Aaunit_struc *audio_au;
unsigned char *audio_frame_start;
unsigned int *bytes_output;
unsigned int mux_rate;
unsigned long audio_buffer_size;
unsigned long video_buffer_size;
unsigned long packet_data_size;
unsigned char marker_pack;
unsigned int which_streams;
{
unsigned int bytes_left;
unsigned int temp;
Pack_struc *pack_ptr;
Sys_header_struc *sys_header_ptr;
if (marker_pack)
{
create_pack (pack, SCR, mux_rate);
create_sys_header (sys_header, mux_rate, 1, 1, 1, 1, 1, 1,
AUDIO_STR_0, 0, audio_buffer_size/128,
VIDEO_STR_0, 1, video_buffer_size/1024, which_streams );
pack_ptr = pack;
sys_header_ptr = sys_header;
}
else
{
pack_ptr = NULL;
sys_header_ptr = NULL;
}
if (*audio_frame_start)
{
create_sector (sector, pack_ptr, sys_header_ptr,
packet_data_size+PACKET_HEADER_SIZE+AFTER_PACKET_LENGTH,
istream_a, AUDIO_STR_0, 0, audio_buffer_size/128,
TRUE, &audio_au->PTS, NULL,
TIMESTAMPS_PTS, which_streams);
bytes_left = sector->length_of_packet_data;
next_audio_access_unit (buffer, audio_au, &bytes_left, aunits_info,
audio_frame_start, SCR_delay);
}
else if (!(*audio_frame_start) && (audio_au->length >= packet_data_size))
{
create_sector (sector, pack_ptr, sys_header_ptr,
packet_data_size+PACKET_HEADER_SIZE+AFTER_PACKET_LENGTH,
istream_a, AUDIO_STR_0, 0, audio_buffer_size/128,
TRUE, NULL, NULL,
TIMESTAMPS_NO, which_streams );
bytes_left = sector->length_of_packet_data;
next_audio_access_unit (buffer, audio_au, &bytes_left, aunits_info,
audio_frame_start, SCR_delay);
}
else if (!(*audio_frame_start) && (audio_au->length < packet_data_size))
{
temp = audio_au->length;
queue_buffer (buffer, audio_au->length, &audio_au->PTS);
#ifdef TIMER
gettimeofday (&tp_start,NULL);
#endif
if (fread (audio_au, sizeof(Aaunit_struc), 1, aunits_info)==1)
{
*audio_frame_start = TRUE;
add_to_timecode (SCR_delay, &audio_au->PTS);
create_sector (sector, pack_ptr, sys_header_ptr,
packet_data_size+PACKET_HEADER_SIZE+AFTER_PACKET_LENGTH,
istream_a, AUDIO_STR_0, 0, audio_buffer_size/128,
TRUE, &audio_au->PTS, NULL,
TIMESTAMPS_PTS, which_streams );
bytes_left = sector->length_of_packet_data - temp;
next_audio_access_unit (buffer, audio_au, &bytes_left, aunits_info,
audio_frame_start, SCR_delay);
} else
{
//status_message(STATUS_AUDIO_END);
empty_aaunit_struc (audio_au);
create_sector (sector, pack_ptr, sys_header_ptr,
packet_data_size+PACKET_HEADER_SIZE+AFTER_PACKET_LENGTH,
istream_a, AUDIO_STR_0, 0, audio_buffer_size/128,
TRUE, NULL, NULL,
TIMESTAMPS_NO, which_streams );
};
#ifdef TIMER
gettimeofday (&tp_end,NULL);
total_sec += (tp_end.tv_sec - tp_start.tv_sec);
total_usec += (tp_end.tv_usec - tp_start.tv_usec);
#endif
}
#ifdef TIMER
gettimeofday (&tp_start,NULL);
#endif
fwrite (sector->buf, sector->length_of_sector, 1, ostream);
#ifdef TIMER
gettimeofday (&tp_end,NULL);
total_sec += (tp_end.tv_sec - tp_start.tv_sec);
total_usec += (tp_end.tv_usec - tp_start.tv_usec);
#endif
*bytes_output += sector->length_of_sector;
}
/******************************************************************
Output_Padding
為填充流產生Pack/Sys Header/Packet信息
******************************************************************/
void output_padding (SCR, ostream,
pack, sys_header, sector, bytes_output, mux_rate,
audio_buffer_size, video_buffer_size,
packet_data_size, marker_pack, which_streams)
Timecode_struc *SCR;
FILE *ostream;
Pack_struc *pack;
Sys_header_struc *sys_header;
Sector_struc *sector;
unsigned int *bytes_output;
unsigned int mux_rate;
unsigned long audio_buffer_size;
unsigned long video_buffer_size;
unsigned long packet_data_size;
unsigned char marker_pack;
unsigned int which_streams;
{
//unsigned int temp;
Pack_struc *pack_ptr;
Sys_header_struc *sys_header_ptr;
if (marker_pack)
{
create_pack (pack, SCR, mux_rate);
create_sys_header (sys_header, mux_rate, 1, 1, 1, 1, 1, 1,
AUDIO_STR_0, 0, audio_buffer_size/128,
VIDEO_STR_0, 1, video_buffer_size/1024, which_streams );
pack_ptr = pack;
sys_header_ptr = sys_header;
}
else
{
pack_ptr = NULL;
sys_header_ptr = NULL;
}
create_sector (sector, pack_ptr, sys_header_ptr,
packet_data_size+PACKET_HEADER_SIZE+AFTER_PACKET_LENGTH,
NULL, PADDING_STR, 0, 0,
FALSE, NULL, NULL,
TIMESTAMPS_NO, which_streams );
#ifdef TIMER
gettimeofday (&tp_start,NULL);
#endif
fwrite (sector->buf, sector->length_of_sector*sizeof (unsigned char), 1,
ostream);
#ifdef TIMER
gettimeofday (&tp_end,NULL);
total_sec += (tp_end.tv_sec - tp_start.tv_sec);
total_usec += (tp_end.tv_usec - tp_start.tv_usec);
#endif
*bytes_output += sector->length_of_sector;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -