Changeset 13982


Ignore:
Timestamp:
02/05/12 12:16:45 (12 years ago)
Author:
nit
Message:

[titan] gst fix seek and timeline

File:
1 edited

Legend:

Unmodified
Added
Removed
  • titan/titan/player.h

    r13980 r13982  
    2929#ifdef EPLAYER4
    3030GstElement *m_gst_playbin = NULL;
     31unsigned long long int m_gst_startpts = 0;
    3132#endif
    3233
     
    379380#ifdef EPLAYER4
    380381                int flags = 0x47; //(GST_PLAY_FLAG_VIDEO | GST_PLAY_FLAG_AUDIO | GST_PLAY_FLAG_NATIVE_VIDEO | GST_PLAY_FLAG_TEXT);
    381                 gchar *uri;
    382382               
    383383                if(m_gst_playbin != NULL)
     
    400400
    401401                if(strstr(tmpfile, "file://") == NULL)
    402                         status.playercan = 0x4650;
     402                        status.playercan = 0x7E7F;
    403403                else
    404                         status.playercan = 0x7FFF;
     404                        status.playercan = 0x7E7F;
    405405               
    406406                m_gst_playbin = gst_element_factory_make("playbin2", "playbin");
     
    412412                        gst_element_set_state(m_gst_playbin, GST_STATE_PLAYING);
    413413               
     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                }
    414422                return 0;
    415423#endif
     
    430438{
    431439        int ret = 1;
     440        if(!m_gst_playbin) return 0;
    432441        if(!msg) return ret;
    433         if(!m_gst_playbin) return ret;
    434442
    435443        gchar *sourceName = NULL;
     
    446454                        break;
    447455                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                        }
    449496                        break;
    450497                case GST_MESSAGE_ERROR:
    451498                        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);
    452518                        break;
    453519                case GST_MESSAGE_INFO:
    454520                        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*/
    455535                        break;
    456536                case GST_MESSAGE_TAG:
     
    465545                case GST_MESSAGE_BUFFERING:
    466546                        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*/
    467554                        break;
    468555                case GST_MESSAGE_STREAM_STATUS:
    469556                        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*/
    470586                        break;
    471587                default:
     
    502618                }
    503619        }
     620        else
     621                ret = 0;
     622
    504623        return ret;
    505624#endif
     
    512631        if(player && player->playback)
    513632                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);
    514638#endif
    515639}
     
    644768
    645769#ifdef EPLAYER4
    646         gint64 time_nanoseconds;
    647         gint64 pos;
     770        gint64 nanos_pts = 0, nanos_len = 0;
     771        gint64 pts = 0, len = 0;
    648772        GstFormat fmt = GST_FORMAT_TIME;
    649773               
    650774        if(m_gst_playbin)
    651775        {
    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);
    656789        }
    657790#endif
     
    793926        GstFormat fmt = GST_FORMAT_TIME; //Returns time in nanosecs
    794927       
     928/*
    795929        if(m_gst_playbin)
    796930        {
     
    800934                debug(150, "Pts = %02d:%02d:%02d (%llu.0000 sec)", (int)((sec / 60) / 60) % 60, (int)(sec / 60) % 60, (int)sec % 60, sec);
    801935        }
     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        }
    802966#endif
    803967
     
    826990        {
    827991                gst_element_query_duration(m_gst_playbin, &fmt, &len);
    828                 length = len / 1000000000.0;
     992                length = len / 1000000000;
    829993                if(length < 0) length = 0;
    830994                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.