2013-09-03 2 views
0

Я хочу использовать Bento4 для разбора файла MP4 и проверить, есть ли у них 1 или несколько треков.Bento4, управление экземплярами (создание/выпуск)

AP4_ByteStream* inputFileStream = NULL; 
    AP4_Result res = AP4_FileByteStream::Create(file.c_str(), AP4_FileByteStream::STREAM_MODE_READ, inputFileStream); 
    if(res != AP4_SUCCESS || inputFileStream == NULL) {throw std::logic_error("Error while analyzing " + file);} 

    AP4_File inputFileParser(*inputFileStream); 
    AP4_Movie* pMovie = inputFileParser.GetMovie(); 
    const AP4_List<AP4_Track>& trackList = pMovie->GetTracks(); 
    inputFileStream->Release(); 
    return (trackList.ItemCount()>1); 

Класс AP4_FileByteStream обеспечивает функцию создания и защищало его dtor, вот почему существует release функции.

Но в этом случае я использую указатель и ссылку на const, исходящую от синтаксического анализатора, инициализированного этим FileByteStream. Как мы можем ожидать, что return (trackList.ItemCount()>1); работает после release?

Основываясь на опыте, который я сделал, он работает, но мне может быть повезло! Есть ли у вас какие-либо идеи? Я думал о том, чтобы положить inputFileStream в качестве shared_ptr, чтобы освободить ресурсы только после оценки возврата. Это более безопасно?

+0

нет Bento4 тегов и у меня не хватает репутации, чтобы создать его ... – alexbuisson

ответ

1

Что-нибудь случилось с просто

bool hasMultipleTracks = trackList.ItemCount() > 1; 
inputFileStream->Release(); 
return hasMultipleTracks; 
+0

да, согласен, это самый простой способ, чтобы быть безопасным! но эта фабрика/модель выпуска действительно боль .... – alexbuisson

Смежные вопросы