winlin

ignore other 264 frame except sps,pps,idr,nonidr

@@ -1366,6 +1366,11 @@ int srs_write_h264_raw_frame(Context* context, @@ -1366,6 +1366,11 @@ int srs_write_h264_raw_frame(Context* context,
1366 char* frame, int frame_size, u_int32_t dts, u_int32_t pts 1366 char* frame, int frame_size, u_int32_t dts, u_int32_t pts
1367 ) { 1367 ) {
1368 int ret = ERROR_SUCCESS; 1368 int ret = ERROR_SUCCESS;
  1369 +
  1370 + // empty frame.
  1371 + if (frame_size <= 0) {
  1372 + return ret;
  1373 + }
1369 1374
1370 // for sps 1375 // for sps
1371 if (context->avc_raw.is_sps(frame, frame_size)) { 1376 if (context->avc_raw.is_sps(frame, frame_size)) {
@@ -1399,6 +1404,15 @@ int srs_write_h264_raw_frame(Context* context, @@ -1399,6 +1404,15 @@ int srs_write_h264_raw_frame(Context* context,
1399 return ret; 1404 return ret;
1400 } 1405 }
1401 1406
  1407 + // ignore others.
  1408 + // 5bits, 7.3.1 NAL unit syntax,
  1409 + // H.264-AVC-ISO_IEC_14496-10.pdf, page 44.
  1410 + // 7: SPS, 8: PPS, 5: I Frame, 1: P Frame
  1411 + SrsAvcNaluType nut = (SrsAvcNaluType)(frame[0] & 0x1f);
  1412 + if (nut != SrsAvcNaluTypeSPS && nut != SrsAvcNaluTypePPS && nut != SrsAvcNaluTypeIDR && nut != SrsAvcNaluTypeNonIDR) {
  1413 + return ret;
  1414 + }
  1415 +
1402 // send pps+sps before ipb frames when sps/pps changed. 1416 // send pps+sps before ipb frames when sps/pps changed.
1403 if ((ret = srs_write_h264_sps_pps(context, dts, pts)) != ERROR_SUCCESS) { 1417 if ((ret = srs_write_h264_sps_pps(context, dts, pts)) != ERROR_SUCCESS) {
1404 return ret; 1418 return ret;