//---------------------------------------------------------------------------
size_t Reader_libmms::Format_Test(MediaInfo_Internal* MI, const String &File_Name)
{
    //Opening the file
    mmsx_t* Handle=mmsx_connect(0, 0, Ztring(File_Name).To_Local().c_str(), (int)-1);
    if (Handle==NULL)
        return 0;

    mms_off_t Offset=mmsx_seek(0, Handle, 0, SEEK_SET);
    uint32_t Length=mmsx_get_length(Handle);

    //Buffer
    size_t Buffer_Size_Max=Buffer_NormalSize;
    int8u* Buffer=new int8u[Buffer_Size_Max];

    //Parser
    MI->Open_Buffer_Init(Length, File_Name);

    //Test the format with buffer
    bool StopAfterFilled=MI->Config.File_StopAfterFilled_Get();
    std::bitset<32> Status;
    do
    {
        //Seek (if needed)
        if (MI->Open_Buffer_Continue_GoTo_Get()!=(int64u)-1)
        {
            if (MI->Open_Buffer_Continue_GoTo_Get()>=Length)
                break; //Seek requested, but on a file bigger in theory than what is in the real file, we can't do this
            if (mmsx_seek(0, Handle, mms_off_t(MI->Open_Buffer_Continue_GoTo_Get()), SEEK_SET)!=MI->Open_Buffer_Continue_GoTo_Get())
                break; //File is not seekable

            MI->Open_Buffer_Init((int64u)-1, MI->Open_Buffer_Continue_GoTo_Get());
        }

        //Buffering
        size_t Buffer_Size=mmsx_read(0, Handle, (char*)Buffer, (int)Buffer_Size_Max);
        if (Buffer_Size==0)
            break; //Problem while reading

        //Parser
        Status=MI->Open_Buffer_Continue(Buffer, Buffer_Size);
    }
    while (!(Status[File__Analyze::IsFinished] || (StopAfterFilled && Status[File__Analyze::IsFilled])));
    if (Length==0) //If Size==0, Status is never updated
        Status=MI->Open_Buffer_Continue(NULL, 0);

    //File
    mmsx_close(Handle);

    //Buffer
    delete[] Buffer; //Buffer=NULL;

    //Is this file detected?
    if (!Status[File__Analyze::IsAccepted])
        return 0;

    MI->Open_Buffer_Finalize();

    return 1;
}
示例#2
0
static int
mms_seek (DB_FILE *stream, int64_t offset, int whence) {
    assert (0);
    assert (stream);
    int connect_err = mms_ensure_connected ((MMS_FILE *)stream);
    if (connect_err < 0) {
        return connect_err;
    }
    MMS_FILE *fp = (MMS_FILE *)stream;
    return mmsx_seek ((mms_io_t *)fp->io, fp->stream, offset, whence);
}
示例#3
0
文件: gstmms.c 项目: zsx/ossbuild
static gboolean
gst_mms_do_seek (GstBaseSrc * src, GstSegment * segment)
{
  mms_off_t start;
  GstMMS *mmssrc = GST_MMS (src);

  if (segment->format == GST_FORMAT_TIME) {
    if (!mmsx_time_seek (NULL, mmssrc->connection,
            (double) segment->start / GST_SECOND)) {
      GST_LOG_OBJECT (mmssrc, "mmsx_time_seek() failed");
      return FALSE;
    }
    start = mmsx_get_current_pos (mmssrc->connection);
    GST_INFO_OBJECT (mmssrc, "sought to %" GST_TIME_FORMAT ", offset after "
        "seek: %" G_GINT64_FORMAT, GST_TIME_ARGS (segment->start), start);
  } else if (segment->format == GST_FORMAT_BYTES) {
    start = mmsx_seek (NULL, mmssrc->connection, segment->start, SEEK_SET);
    /* mmsx_seek will close and reopen the connection when seeking with the
       mmsh protocol, if the reopening fails this is indicated with -1 */
    if (start == -1) {
      GST_DEBUG_OBJECT (mmssrc, "connection broken during seek");
      return FALSE;
    }
    GST_INFO_OBJECT (mmssrc, "sought to: %" G_GINT64_FORMAT " bytes, "
        "result: %" G_GINT64_FORMAT, segment->start, start);
  } else {
    GST_DEBUG_OBJECT (mmssrc, "unsupported seek segment format: %s",
        GST_STR_NULL (gst_format_get_name (segment->format)));
    return FALSE;
  }
  gst_segment_init (segment, GST_FORMAT_BYTES);
  gst_segment_set_seek (segment, segment->rate, GST_FORMAT_BYTES,
      segment->flags, GST_SEEK_TYPE_SET, start, GST_SEEK_TYPE_NONE,
      segment->stop, NULL);
  return TRUE;
}
示例#4
0
//---------------------------------------------------------------------------
size_t Reader_libmms::Format_Test(MediaInfo_Internal* MI, const String &File_Name)
{
    mmsx_t* Handle;

    //Opening the file
#if MEDIAINFO_LIBMMS_DESCRIBE_SUPPORT
    if (MI->Config.File_Mmsh_Describe_Only_Get())
    {
        // Use MMSH & Send a DESCRIBE request
        mmsh_t* MmshHandle;

        MmshHandle=mmsh_describe_request(0, 0, Ztring(File_Name).To_Local().c_str());
        if (MmshHandle==NULL)
            return 0;

        Handle=mmsx_set_mmsh_handle(MmshHandle);
        if (Handle==NULL)
        {
            mmsh_close(MmshHandle);
            return 0;
        }
    }
    else
#endif //MEDIAINFO_LIBMMS_DESCRIBE_SUPPORT
    {
        // Use MMS or MMSH (Send a DESCRIBE & PLAY request)
        Handle=mmsx_connect(0, 0, Ztring(File_Name).To_Local().c_str(), (int)-1);
        if (Handle==NULL)
            return 0;
    }

    //Init
    size_t Buffer_Size_Max;
    uint32_t Length;
    if (!MI->Config.File_Mmsh_Describe_Only_Get())
    {
        //Buffer
        Buffer_Size_Max=Buffer_NormalSize;

        //MediaInfo init
        mms_off_t Offset=mmsx_seek(0, Handle, 0, SEEK_SET);
        uint32_t Length=mmsx_get_length(Handle);
        MI->Open_Buffer_Init(Length, File_Name);
    }
    else
    {
        //Buffer
        Buffer_Size_Max=mmsx_get_asf_header_len(Handle);

        //MediaInfo init
        Length=(uint32_t)-1;
        MI->Open_Buffer_Init((int64u)-1, File_Name);
    }
    int8u* Buffer=new int8u[Buffer_Size_Max];

    //Test the format with buffer
    bool StopAfterFilled=MI->Config.File_StopAfterFilled_Get();
    std::bitset<32> Status;
    do
    {
        //Seek (if needed)
        if (MI->Open_Buffer_Continue_GoTo_Get()!=(int64u)-1)
        {
            if (MI->Open_Buffer_Continue_GoTo_Get()>=Length)
                break; //Seek requested, but on a file bigger in theory than what is in the real file, we can't do this
            if (mmsx_seek(0, Handle, mms_off_t(MI->Open_Buffer_Continue_GoTo_Get()), SEEK_SET)!=MI->Open_Buffer_Continue_GoTo_Get())
                break; //File is not seekable

            MI->Open_Buffer_Init((int64u)-1, MI->Open_Buffer_Continue_GoTo_Get());
        }

        //Buffering
        size_t Buffer_Size;
        if (!MI->Config.File_Mmsh_Describe_Only_Get())
            Buffer_Size=mmsx_read(0, Handle, (char*)Buffer, (int)Buffer_Size_Max);
        else
            Buffer_Size=mmsx_peek_header(Handle, (char*)Buffer, (int)Buffer_Size_Max);

        //Parser
        Status=MI->Open_Buffer_Continue(Buffer, Buffer_Size);
        if (Buffer_Size==0 || MI->Config.File_Mmsh_Describe_Only_Get())
            break;
    }
    while (!(Status[File__Analyze::IsFinished] || (StopAfterFilled && Status[File__Analyze::IsFilled])));

    //File
    mmsx_close(Handle);

    //Buffer
    delete[] Buffer; //Buffer=NULL;

    //Is this file detected?
    if (!Status[File__Analyze::IsAccepted])
        return 0;

    MI->Open_Buffer_Finalize();

    return 1;
}