refine ts code

pull/133/head
winlin 11 years ago
parent 38e66be490
commit d5b84b5e20

@ -301,6 +301,10 @@ public:
{
int ret = ERROR_SUCCESS;
if (!buffer->bytes || buffer->size <= 0) {
return ret;
}
char* last = buffer->bytes + buffer->size;
char* pos = buffer->bytes;
@ -550,6 +554,10 @@ int SrsTSMuxer::write_audio(u_int32_t time, SrsCodec* codec, SrsCodecSample* sam
{
int ret = ERROR_SUCCESS;
audio_frame.dts = audio_frame.pts = time * 90;
audio_frame.pid = TS_AUDIO_PID;
audio_frame.sid = TS_AUDIO_AAC;
for (int i = 0; i < sample->nb_buffers; i++) {
SrsCodecBuffer* buf = &sample->buffers[i];
int32_t size = buf->size;
@ -610,10 +618,6 @@ int SrsTSMuxer::write_audio(u_int32_t time, SrsCodec* codec, SrsCodecSample* sam
audio_buffer->append(buf->bytes, buf->size);
}
audio_frame.dts = audio_frame.pts = time * 90;
audio_frame.pid = TS_AUDIO_PID;
audio_frame.sid = TS_AUDIO_AAC;
return ret;
}
@ -621,9 +625,16 @@ int SrsTSMuxer::write_video(u_int32_t time, SrsCodec* codec, SrsCodecSample* sam
{
int ret = ERROR_SUCCESS;
video_frame.dts = time * 90;
video_frame.pts = video_frame.dts + sample->cts * 90;
video_frame.pid = TS_VIDEO_PID;
video_frame.sid = TS_VIDEO_AVC;
video_frame.key = sample->frame_type == SrsCodecVideoAVCFrameKeyFrame;
static u_int8_t aud_nal[] = { 0x00, 0x00, 0x00, 0x01, 0x09, 0xf0 };
video_buffer->append(aud_nal, sizeof(aud_nal));
bool sps_pps_sent = false;
for (int i = 0; i < sample->nb_buffers; i++) {
SrsCodecBuffer* buf = &sample->buffers[i];
int32_t size = buf->size;
@ -634,6 +645,14 @@ int SrsTSMuxer::write_video(u_int32_t time, SrsCodec* codec, SrsCodecSample* sam
return ret;
}
if (video_frame.key && !sps_pps_sent) {
// sample start prefix
video_buffer->append(aud_nal, 4);
// sps and pps
// TODO: do in right way.
video_buffer->append(codec->avc_extra_data, codec->avc_extra_size);
}
// sample start prefix, '00 00 00 01' or '00 00 01'
u_int8_t* p = aud_nal + 1;
u_int8_t* end = p + 3;
@ -648,12 +667,6 @@ int SrsTSMuxer::write_video(u_int32_t time, SrsCodec* codec, SrsCodecSample* sam
video_buffer->append(buf->bytes, buf->size);
}
video_frame.dts = time * 90;
video_frame.pts = video_frame.dts + sample->cts * 90;
video_frame.pid = TS_VIDEO_PID;
video_frame.sid = TS_VIDEO_AVC;
video_frame.key = sample->frame_type == SrsCodecVideoAVCFrameKeyFrame;
if ((ret = SrsMpegtsWriter::write_frame(fd, &video_frame, video_buffer)) != ERROR_SUCCESS) {
return ret;
}

Loading…
Cancel
Save