diff --git a/trunk/research/librtmp/srs_h264_raw_publish.c b/trunk/research/librtmp/srs_h264_raw_publish.c index c2e468671..de3006af1 100644 --- a/trunk/research/librtmp/srs_h264_raw_publish.c +++ b/trunk/research/librtmp/srs_h264_raw_publish.c @@ -157,18 +157,9 @@ int main(int argc, char** argv) goto rtmp_destroy; } - // convert the h264 packet to rtmp packet. - char* rtmp_data = NULL; - int rtmp_size = 0; - u_int32_t timestamp = 0; - if (srs_h264_to_rtmp(data, size, dts, pts, &rtmp_data, &rtmp_size, ×tamp) != 0) { - srs_trace("h264 raw data to rtmp data failed."); - goto rtmp_destroy; - } - - // send out the rtmp packet. - int type = SRS_RTMP_TYPE_VIDEO; - if (srs_write_packet(rtmp, type, timestamp, rtmp_data, rtmp_size) != 0) { + // send out the h264 packet over RTMP + if (srs_write_h264_raw_frame(rtmp, data, size, dts, pts) != 0) { + srs_trace("send h264 raw data failed."); goto rtmp_destroy; } @@ -176,7 +167,7 @@ int main(int argc, char** argv) // H.264-AVC-ISO_IEC_14496-10.pdf, page 44. u_int8_t nut = (char)data[0] & 0x1f; srs_trace("sent packet: type=%s, time=%d, size=%d, fps=%d, b[0]=%#x(%s)", - srs_type2string(type), timestamp, rtmp_size, fps, nut, + srs_type2string(SRS_RTMP_TYPE_VIDEO), dts, size, fps, nut, (nut == 7? "SPS":(nut == 8? "PPS":(nut == 5? "I":(nut == 1? "P":"Unknown"))))); // @remark, when use encode device, it not need to sleep. diff --git a/trunk/src/libs/srs_librtmp.cpp b/trunk/src/libs/srs_librtmp.cpp index 926937e1e..9ed416acd 100644 --- a/trunk/src/libs/srs_librtmp.cpp +++ b/trunk/src/libs/srs_librtmp.cpp @@ -70,6 +70,9 @@ struct Context SimpleSocketStream* skt; int stream_id; + // for h264 raw stream + SrsStream raw_stream; + Context() { rtmp = NULL; skt = NULL; @@ -996,22 +999,31 @@ char* srs_amf0_human_print(srs_amf0_t amf0, char** pdata, int* psize) return any->human_print(pdata, psize); } -int srs_h264_to_rtmp(char* h264_raw_data, int h264_raw_size, u_int32_t dts, u_int32_t pts, char** prtmp_data, int* prtmp_size, u_int32_t* ptimestamp) +int srs_write_h264_raw_frame(srs_rtmp_t rtmp, char* frame, int frame_size, u_int32_t dts, u_int32_t pts) { - srs_assert(h264_raw_size > 0); + int ret = ERROR_SUCCESS; + + srs_assert(frame_size > 0); - // the timestamp in rtmp message header is dts. - *ptimestamp = dts; + srs_assert(rtmp != NULL); + Context* context = (Context*)rtmp; + + if ((ret = context->raw_stream.initialize(frame, frame_size)) != ERROR_SUCCESS) { + return ret; + } + + + /*// the timestamp in rtmp message header is dts. + u_int32_t timestamp = dts; // for h264 in RTMP video payload, there is 5bytes header: // 1bytes, FrameType | CodecID // 1bytes, AVCPacketType // 3bytes, CompositionTime, the cts. // @see: E.4.3 Video Tags, video_file_format_spec_v10_1.pdf, page 78 - *prtmp_size = h264_raw_size + 5; - char* p = new char[*prtmp_size]; - memcpy(p + 5, h264_raw_data, h264_raw_size); - *prtmp_data = p; + int size = h264_raw_size + 5; + char* data = new char[size]; + memcpy(data + 5, h264_raw_data, h264_raw_size); // 5bits, 7.3.1 NAL unit syntax, // H.264-AVC-ISO_IEC_14496-10.pdf, page 44. @@ -1044,9 +1056,9 @@ int srs_h264_to_rtmp(char* h264_raw_data, int h264_raw_size, u_int32_t dts, u_in char* pp = (char*)&cts; *p++ = pp[2]; *p++ = pp[1]; - *p++ = pp[0]; + *p++ = pp[0];*/ - return 0; + return ret; } int srs_h264_startswith_annexb(char* h264_raw_data, int h264_raw_size, int* pnb_start_code) diff --git a/trunk/src/libs/srs_librtmp.hpp b/trunk/src/libs/srs_librtmp.hpp index 9d2023072..718add2e2 100644 --- a/trunk/src/libs/srs_librtmp.hpp +++ b/trunk/src/libs/srs_librtmp.hpp @@ -337,24 +337,21 @@ extern char* srs_amf0_human_print(srs_amf0_t amf0, char** pdata, int* psize); ************************************************************** *************************************************************/ /** -* convert h264 stream data to rtmp packet. -* @param h264_raw_data the input h264 raw data, a encoded h.264 I/P/B frame data. -* @paam h264_raw_size the size of h264 raw data. assert > 0. +* write h.264 raw frame to rtmp server. +* @param frame the input h264 raw data, an encoded h.264 I/P/B frame data. +* it must be prefixed by h.264 annexb format, by N[00] 00 00 01, where N>=0, +* for instance, 00 00 00 01 67 42 80 29 95 A0 14 01 6E 40 +* @paam frame_size the size of h264 raw data. assert frame_size > 0. * @param dts the dts of h.264 raw data. * @param pts the pts of h.264 raw data. -* @param prtmp_data the output rtmp format packet, which can be send by srs_write_packet. -* @param prtmp_size the size of rtmp packet, for srs_write_packet. -* @param ptimestamp the timestamp of rtmp packet, for srs_write_packet. * -* @remark, user should free the h264_raw_data. -* @remark, user should free the prtmp_data if success. +* @remark, user should free the frame. * @remark, the tbn of dts/pts is 1/1000 for RTMP, that is, in ms. * * @return 0, success; otherswise, failed. */ -extern int srs_h264_to_rtmp( - char* h264_raw_data, int h264_raw_size, u_int32_t dts, u_int32_t pts, - char** prtmp_data, int* prtmp_size, u_int32_t* ptimestamp +extern int srs_write_h264_raw_frame(srs_rtmp_t rtmp, + char* frame, int frame_size, u_int32_t dts, u_int32_t pts ); /** * whether h264 raw data starts with the annexb,