Changeset 32759


Ignore:
Timestamp:
01/28/15 20:08:57 (9 years ago)
Author:
gost
Message:

[titan] gstreamer... fix subtitle sync after ff

File:
1 edited

Legend:

Unmodified
Added
Removed
  • titan/titan/player.h

    r32743 r32759  
    3030#ifdef EPLAYER4
    3131GstElement *pipeline = NULL;
     32gdouble m_framerate;
    3233unsigned long long m_gst_startpts = 0;
    3334CustomData data;
    3435GstElement *video_sink = NULL;
    3536struct stimerthread* subtitlethread = NULL;
    36 int buf_pos_ms = 0;
    37 int duration_ms = 0;
     37uint32_t buf_pos_ms = 0;
     38uint32_t duration_ms = 0;
    3839int subtitleflag = 0;
    3940char *subtext = NULL;
     
    641642void playersubtitleAvail(GstElement *subsink, GstBuffer *buffer, gpointer user_data)
    642643{
     644        printf("++++++ subtitelflag: %i\n", subtitleflag);
    643645        if(subtitleflag == 0 || subtitleflag == 2) return;
    644646       
     
    646648        gint64 duration_ns = GST_BUFFER_DURATION(buffer);
    647649       
     650        time_t running_pts = 0;
     651        gint64 pos = 0;
     652        int32_t decoder_ms;
     653        GstFormat fmt = GST_FORMAT_TIME;
     654       
    648655#if GST_VERSION_MAJOR < 1
    649                 size_t len = GST_BUFFER_SIZE(buffer);
     656        if (!gst_element_query_position(pipeline, &fmt, &pos))
    650657#else
    651                 size_t len = gst_buffer_get_size(buffer);
    652 #endif
    653        
     658        if (!gst_element_query_position(pipeline, fmt, &pos))
     659#endif
     660        {
     661                err("gst_element_query_position failed");
     662                return;
     663        }
     664        running_pts = pos / 11111LL;
     665        decoder_ms = running_pts / 90;
     666               
    654667        if(subtitlethread == NULL)
    655668                subtitlethread = addtimer(&playersubtitle_thread, START, 10000, 1, NULL, NULL, NULL);
     669       
     670#if GST_VERSION_MAJOR < 1
     671        size_t len = GST_BUFFER_SIZE(buffer);
     672#else
     673        size_t len = gst_buffer_get_size(buffer);
     674#endif
    656675       
    657676        printf("BUFFER_TIMESTAMP: %lld - BUFFER_DURATION: %lld in ns\n", buf_pos, duration_ns);
     
    672691        }               
    673692        sprintf(subtext, "%s", GST_BUFFER_DATA(buffer));
    674         buf_pos_ms  = buf_pos / 1000000ULL;
     693       
     694        double convert_fps = 1.0;
     695        buf_pos_ms  = (buf_pos / 1000000ULL) * convert_fps;
    675696        duration_ms = duration_ns / 1000000ULL;
     697
     698        printf("++++++ buff_pos  : %u\n", buf_pos_ms);
     699        printf("++++++ decoder_ms: %i\n", decoder_ms);
    676700}
    677701#endif
     
    810834                        //status.playercan = 0x7EFF;
    811835                        status.playercan = 0xFEFF;
    812        
     836               
     837                m_framerate = -1;
    813838                pipeline = gst_element_factory_make("playbin2", "playbin");
    814839
     
    10771102                //      break;
    10781103                case GST_MESSAGE_ELEMENT:
     1104                        printf("***************----***************-----**********\n");
     1105                        const GstStructure *msgstruct = gst_message_get_structure(msg);
     1106                        if (msgstruct)
     1107                        {
     1108                                const gchar *eventname = gst_structure_get_name(msgstruct);
     1109                                if (!strcmp(eventname, "eventFrameRateChanged") || !strcmp(eventname, "eventFrameRateAvail"))
     1110                                {
     1111                                        gst_structure_get_int (msgstruct, "frame_rate", &m_framerate);
     1112                                }
     1113                        }
    10791114                        debug(150, "gst player element");
    10801115                        break;
     
    14481483        {
    14491484                if(status.playspeed != 0 || status.slowspeed != 0)
    1450                         playersend_ff_fr_event(1);
     1485                {
     1486                        //subtitle sync bug... start
     1487                        gint64 time_nanoseconds = 0;
     1488                        GstFormat fmt = GST_FORMAT_TIME;
     1489#if GST_VERSION_MAJOR < 1
     1490                        if (!gst_element_query_position(pipeline, &fmt, &time_nanoseconds))
     1491#else
     1492                        if (!gst_element_query_position(pipeline, fmt, &time_nanoseconds))
     1493#endif
     1494                        {
     1495                                err("gst_element_query_position failed");
     1496                                return;
     1497                        }
     1498                        time_nanoseconds = time_nanoseconds - 90000;
     1499                        if (!gst_element_seek (pipeline, 1, GST_FORMAT_TIME, (GstSeekFlags)(GST_SEEK_FLAG_FLUSH | GST_SEEK_FLAG_KEY_UNIT),GST_SEEK_TYPE_SET, time_nanoseconds,GST_SEEK_TYPE_NONE, GST_CLOCK_TIME_NONE))
     1500                                printf("seekTo failed");
     1501                        //subtitle sync bug... end
     1502
     1503                        //playersend_ff_fr_event(1);
     1504                }               
    14511505                gst_element_set_state(pipeline, GST_STATE_PLAYING);
    14521506                if(subtitleflag == 2)
Note: See TracChangeset for help on using the changeset viewer.