winlin

for #179, wait keyframe for dvr. 2.0.127

@@ -307,10 +307,10 @@ int SrsFlvSegment::write_video(SrsSharedPtrMessage* __video) @@ -307,10 +307,10 @@ int SrsFlvSegment::write_video(SrsSharedPtrMessage* __video)
307 char* payload = video->payload; 307 char* payload = video->payload;
308 int size = video->size; 308 int size = video->size;
309 309
  310 + bool is_sequence_header = SrsFlvCodec::video_is_sequence_header(payload, size);
310 #ifdef SRS_AUTO_HTTP_CALLBACK 311 #ifdef SRS_AUTO_HTTP_CALLBACK
311 bool is_key_frame = SrsFlvCodec::video_is_h264(payload, size) 312 bool is_key_frame = SrsFlvCodec::video_is_h264(payload, size)
312 - && SrsFlvCodec::video_is_keyframe(payload, size)  
313 - && !SrsFlvCodec::video_is_sequence_header(payload, size); 313 + && SrsFlvCodec::video_is_keyframe(payload, size) && !is_sequence_header;
314 if (is_key_frame) { 314 if (is_key_frame) {
315 has_keyframe = true; 315 has_keyframe = true;
316 if ((ret = plan->on_video_keyframe()) != ERROR_SUCCESS) { 316 if ((ret = plan->on_video_keyframe()) != ERROR_SUCCESS) {
@@ -319,6 +319,16 @@ int SrsFlvSegment::write_video(SrsSharedPtrMessage* __video) @@ -319,6 +319,16 @@ int SrsFlvSegment::write_video(SrsSharedPtrMessage* __video)
319 } 319 }
320 srs_verbose("dvr video is key: %d", is_key_frame); 320 srs_verbose("dvr video is key: %d", is_key_frame);
321 #endif 321 #endif
  322 +
  323 + // accept the sequence header here.
  324 + // when got no keyframe, ignore when should wait keyframe.
  325 + if (!has_keyframe && !is_sequence_header) {
  326 + bool wait_keyframe = _srs_config->get_dvr_wait_keyframe(req->vhost);
  327 + if (wait_keyframe) {
  328 + srs_info("dvr: ignore when wait keyframe.");
  329 + return ret;
  330 + }
  331 + }
322 332
323 if ((jitter->correct(video, 0, 0, jitter_algorithm)) != ERROR_SUCCESS) { 333 if ((jitter->correct(video, 0, 0, jitter_algorithm)) != ERROR_SUCCESS) {
324 return ret; 334 return ret;
@@ -31,7 +31,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. @@ -31,7 +31,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
31 // current release version 31 // current release version
32 #define VERSION_MAJOR 2 32 #define VERSION_MAJOR 2
33 #define VERSION_MINOR 0 33 #define VERSION_MINOR 0
34 -#define VERSION_REVISION 126 34 +#define VERSION_REVISION 127
35 35
36 // server info. 36 // server info.
37 #define RTMP_SIG_SRS_KEY "SRS" 37 #define RTMP_SIG_SRS_KEY "SRS"