Changeset 13982
- Timestamp:
- 02/05/12 12:16:45 (12 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
titan/titan/player.h
r13980 r13982 29 29 #ifdef EPLAYER4 30 30 GstElement *m_gst_playbin = NULL; 31 unsigned long long int m_gst_startpts = 0; 31 32 #endif 32 33 … … 379 380 #ifdef EPLAYER4 380 381 int flags = 0x47; //(GST_PLAY_FLAG_VIDEO | GST_PLAY_FLAG_AUDIO | GST_PLAY_FLAG_NATIVE_VIDEO | GST_PLAY_FLAG_TEXT); 381 gchar *uri;382 382 383 383 if(m_gst_playbin != NULL) … … 400 400 401 401 if(strstr(tmpfile, "file://") == NULL) 402 status.playercan = 0x 4650;402 status.playercan = 0x7E7F; 403 403 else 404 status.playercan = 0x7 FFF;404 status.playercan = 0x7E7F; 405 405 406 406 m_gst_playbin = gst_element_factory_make("playbin2", "playbin"); … … 412 412 gst_element_set_state(m_gst_playbin, GST_STATE_PLAYING); 413 413 414 int count = 0; 415 m_gst_startpts = 0; 416 while(m_gst_startpts == 0 && count < 5) 417 { 418 count++; 419 sleep(1); 420 m_gst_startpts = playergetpts(); 421 } 414 422 return 0; 415 423 #endif … … 430 438 { 431 439 int ret = 1; 440 if(!m_gst_playbin) return 0; 432 441 if(!msg) return ret; 433 if(!m_gst_playbin) return ret;434 442 435 443 gchar *sourceName = NULL; … … 446 454 break; 447 455 case GST_MESSAGE_STATE_CHANGED: 448 debug(150, "gst player state changed"); 456 if(GST_MESSAGE_SRC(msg) != GST_OBJECT(m_gst_playbin)) 457 break; 458 459 GstState old_state, new_state; 460 gst_message_parse_state_changed(msg, &old_state, &new_state, NULL); 461 462 if(old_state == new_state) break; 463 464 debug(150, "gst state change %s -> %s", gst_element_state_get_name(old_state), gst_element_state_get_name(new_state)); 465 466 GstStateChange transition = (GstStateChange)GST_STATE_TRANSITION(old_state, new_state); 467 468 switch(transition) 469 { 470 case GST_STATE_CHANGE_NULL_TO_READY: 471 break; 472 case GST_STATE_CHANGE_READY_TO_PAUSED: 473 /* 474 GstElement *appsink = gst_bin_get_by_name(GST_BIN(m_gst_playbin), "subtitle_sink"); 475 if(appsink) 476 { 477 g_object_set(G_OBJECT(appsink), "max-buffers", 2, NULL); 478 g_object_set(G_OBJECT(appsink), "sync", FALSE, NULL); 479 g_object_set(G_OBJECT(appsink), "emit-signals", TRUE, NULL); 480 gst_object_unref(appsink); 481 } 482 */ 483 break; 484 case GST_STATE_CHANGE_PAUSED_TO_PLAYING: 485 //if(m_sourceinfo.is_streaming && m_streamingsrc_timeout ) 486 //m_streamingsrc_timeout->stop(); 487 break; 488 case GST_STATE_CHANGE_PLAYING_TO_PAUSED: 489 break; 490 case GST_STATE_CHANGE_PAUSED_TO_READY: 491 break; 492 case GST_STATE_CHANGE_READY_TO_NULL: 493 ret = 0; 494 break; 495 } 449 496 break; 450 497 case GST_MESSAGE_ERROR: 451 498 debug(150, "gst player error"); 499 500 gchar *gdebug1; 501 GError *err; 502 503 gst_message_parse_error(msg, &err, &gdebug1); 504 g_free(gdebug1); 505 506 debug(150, "gst error: %s (%i) from %s", err->message, err->code, sourceName); 507 if(err->domain == GST_STREAM_ERROR) 508 { 509 if(err->code == GST_STREAM_ERROR_CODEC_NOT_FOUND ) 510 { 511 //if(g_strrstr(sourceName, "videosink")) 512 // m_event((iPlayableService*)this, evUser+11); 513 //else if ( g_strrstr(sourceName, "audiosink") ) 514 // m_event((iPlayableService*)this, evUser+10); 515 } 516 } 517 g_error_free(err); 452 518 break; 453 519 case GST_MESSAGE_INFO: 454 520 debug(150, "gst player info"); 521 522 /* 523 gchar *gdebug2; 524 GError *inf; 525 526 gst_message_parse_info(msg, &inf, &gdebug2); 527 g_free(gdebug2); 528 if(inf->domain == GST_STREAM_ERROR && inf->code == GST_STREAM_ERROR_DECODE ) 529 { 530 //if(g_strrstr(sourceName, "videosink")) 531 // m_event((iPlayableService*)this, evUser+14); 532 } 533 g_error_free(inf); 534 */ 455 535 break; 456 536 case GST_MESSAGE_TAG: … … 465 545 case GST_MESSAGE_BUFFERING: 466 546 debug(150, "gst player buffering"); 547 548 /* 549 GstBufferingMode mode; 550 gst_message_parse_buffering(msg, &(m_bufferInfo.bufferPercent)); 551 gst_message_parse_buffering_stats(msg, &mode, &(m_bufferInfo.avgInRate), &(m_bufferInfo.avgOutRate), &(m_bufferInfo.bufferingLeft)); 552 //m_event((iPlayableService*)this, evBuffering); 553 */ 467 554 break; 468 555 case GST_MESSAGE_STREAM_STATUS: 469 556 debug(150, "gst player stream status"); 557 558 /* 559 GstStreamStatusType type; 560 GstElement *owner; 561 562 gst_message_parse_stream_status(msg, &type, &owner); 563 if(type == GST_STREAM_STATUS_TYPE_CREATE && m_sourceinfo.is_streaming) 564 { 565 if(GST_IS_PAD(source)) 566 owner = gst_pad_get_parent_element(GST_PAD(source)); 567 else if(GST_IS_ELEMENT(source)) 568 owner = GST_ELEMENT(source); 569 else 570 owner = NULL; 571 if(owner) 572 { 573 GstElementFactory *factory = gst_element_get_factory(GST_ELEMENT(owner)); 574 const gchar *name = gst_plugin_feature_get_name(GST_PLUGIN_FEATURE(factory)); 575 if (!strcmp(name, "souphttpsrc")) 576 { 577 //m_streamingsrc_timeout->start(10 * 1000, true); 578 g_object_set(G_OBJECT(owner), "timeout", 10, NULL); 579 } 580 581 } 582 if(GST_IS_PAD(source)) 583 gst_object_unref(owner); 584 } 585 */ 470 586 break; 471 587 default: … … 502 618 } 503 619 } 620 else 621 ret = 0; 622 504 623 return ret; 505 624 #endif … … 512 631 if(player && player->playback) 513 632 player->playback->Command(player, PLAYBACK_PLAY, NULL); 633 #endif 634 635 #ifdef EPLAYER4 636 if(m_gst_playbin) 637 gst_element_set_state(m_gst_playbin, GST_STATE_PLAYING); 514 638 #endif 515 639 } … … 644 768 645 769 #ifdef EPLAYER4 646 gint64 time_nanoseconds;647 gint64 p os;770 gint64 nanos_pts = 0, nanos_len = 0; 771 gint64 pts = 0, len = 0; 648 772 GstFormat fmt = GST_FORMAT_TIME; 649 773 650 774 if(m_gst_playbin) 651 775 { 652 gst_element_query_position(m_gst_playbin, &fmt, &pos); 653 time_nanoseconds = pos + (sec * 1000000000); 654 if(time_nanoseconds < 0) time_nanoseconds = 0; 655 gst_element_seek(m_gst_playbin, 1.0, GST_FORMAT_TIME, GST_SEEK_FLAG_FLUSH, GST_SEEK_TYPE_SET, time_nanoseconds, GST_SEEK_TYPE_NONE, GST_CLOCK_TIME_NONE); 776 len = playergetlength(); 777 nanos_len = len * 1000000000; 778 if(nanos_len < 0) nanos_len = 0; 779 780 pts = playergetpts(); 781 nanos_pts = pts * 11111; 782 nanos_pts = nanos_pts + (sec * 1000000000); 783 if(nanos_pts < 0) nanos_pts = 0; 784 785 if(nanos_pts >= nanos_len) 786 playerstop(); 787 else 788 gst_element_seek(m_gst_playbin, 1.0, GST_FORMAT_TIME, GST_SEEK_FLAG_FLUSH, GST_SEEK_TYPE_SET, nanos_pts, GST_SEEK_TYPE_NONE, GST_CLOCK_TIME_NONE); 656 789 } 657 790 #endif … … 793 926 GstFormat fmt = GST_FORMAT_TIME; //Returns time in nanosecs 794 927 928 /* 795 929 if(m_gst_playbin) 796 930 { … … 800 934 debug(150, "Pts = %02d:%02d:%02d (%llu.0000 sec)", (int)((sec / 60) / 60) % 60, (int)(sec / 60) % 60, (int)sec % 60, sec); 801 935 } 936 */ 937 938 if(m_gst_playbin) 939 { 940 gint64 pos; 941 GstElement *sink; 942 pts = 0; 943 944 g_object_get(G_OBJECT (m_gst_playbin), "audio-sink", &sink, NULL); 945 946 if(!sink) g_object_get (G_OBJECT (m_gst_playbin), "video-sink", &sink, NULL); 947 if(!sink) return 0; 948 949 gchar *name = gst_element_get_name(sink); 950 gboolean use_get_decoder_time = strstr(name, "dvbaudiosink") || strstr(name, "dvbvideosink"); 951 g_free(name); 952 953 if(use_get_decoder_time) g_signal_emit_by_name(sink, "get-decoder-time", &pos); 954 955 gst_object_unref(sink); 956 957 if(!use_get_decoder_time && !gst_element_query_position(m_gst_playbin, &fmt, &pos)) 958 return 0; 959 960 /* pos is in nanoseconds. we have 90 000 pts per second. */ 961 pts = pos / 11111; 962 pts = pts - m_gst_startpts; 963 sec = pts / 90000; 964 debug(150, "StartPTS = %llu Pts = %02d:%02d:%02d (%llu.0000 sec)", m_gst_startpts, (int)((sec / 60) / 60) % 60, (int)(sec / 60) % 60, (int)sec % 60, sec); 965 } 802 966 #endif 803 967 … … 826 990 { 827 991 gst_element_query_duration(m_gst_playbin, &fmt, &len); 828 length = len / 1000000000 .0;992 length = len / 1000000000; 829 993 if(length < 0) length = 0; 830 994 debug(150, "Length = %02d:%02d:%02d (%.4f sec)", (int)((length / 60) / 60) % 60, (int)(length / 60) % 60, (int)length % 60, length);
Note: See TracChangeset
for help on using the changeset viewer.