blob: e0eb3d1951b7be868eb2f096b5fa6e73325dc766 [file] [log] [blame]
/* ------------------------------------------------------------------
* Copyright (C) 1998-2009 PacketVideo
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
* express or implied.
* See the License for the specific language governing permissions
* and limitations under the License.
* -------------------------------------------------------------------
*/
#include "oscl_base.h"
#ifndef TEST_PV_PLAYER_ENGINE_TESTSET5_H_INCLUDED
#include "test_pv_player_engine_testset5.h"
#endif
#ifndef OSCL_ERROR_CODES_H_INCLUDED
#include "oscl_error_codes.h"
#endif
#ifndef OSCL_TICKCOUNT_H_INCLUDED
#include "oscl_tickcount.h"
#endif
#ifndef OSCL_UTF8CONV_H
#include "oscl_utf8conv.h"
#endif
#ifndef PV_PLAYER_DATASOURCEURL_H_INCLUDED
#include "pv_player_datasourceurl.h"
#endif
#ifndef PV_PLAYER_DATASINKPVMFNODE_H_INCLUDED
#include "pv_player_datasinkpvmfnode.h"
#endif
#ifndef PVMI_MEDIA_IO_FILEOUTPUT_H_INCLUDED
#include "pvmi_media_io_fileoutput.h"
#endif
#ifndef PV_MEDIA_OUTPUT_NODE_FACTORY_H_INCLUDED
#include "pv_media_output_node_factory.h"
#endif
#ifndef PVMF_DOWNLOAD_DATA_SOURCE_H_INCLUDED
#include "pvmf_download_data_source.h"
#endif
#include "pvmf_source_context_data.h"
#ifndef PVMF_CPMPLUGIN_PASSTHRU_OMA1_FACTORY_H_INCLUDED
#include "pvmf_cpmplugin_passthru_oma1_factory.h"
#endif
#ifndef PVMF_CPMPLUGIN_PASSTHRU_OMA1_TYPES_H_INCLUDED
#include "pvmf_cpmplugin_passthru_oma1_types.h"
#endif
#ifndef PVMF_DURATIONINFOMESSAGE_EXTENSION_H_INCLUDED
#include "pvmf_durationinfomessage_extension.h"
#endif
#ifndef PVMF_ERRORINFOMESSAGE_EXTENSION_H_INCLUDED
#include "pvmf_errorinfomessage_extension.h"
#endif
#ifndef PVMF_MP4FFPARSER_EVENTS_H_INCLUDED
#include "pvmf_mp4ffparser_events.h"
#endif
#ifndef PVMF_FILEFORMAT_EVENTS_H_INCLUDED
#include "pvmf_fileformat_events.h"
#endif
#ifndef PVMI_KVP_H_INCLUDED
#include "pvmi_kvp.h"
#endif
#ifndef PVMI_KVP_UTIL_H_INCLUDED
#include "pvmi_kvp_util.h"
#endif
#ifndef PVMF_NODE_INTERFACE_H_INCLUDED
#include "pvmf_node_interface.h"
#endif
#ifndef PVMI_CONFIG_AND_CAPABILITY_H_INCLUDED
#include "pvmi_config_and_capability.h"
#endif
#ifndef PVMF_PROTOCOL_ENGINE_NODE_EVENTS_H_INCLUDED
#include "pvmf_protocol_engine_node_events.h"
#endif
#ifndef PVMF_SOCKET_NODE_EVENTS_H_INCLUDED
#include "pvmf_socket_node_events.h"
#endif
//Default Fast-track download file
#define DEFAULT_FASTTRACK_DL_FILE "test.pvx"
//Default 3gpp download URL, in both single and wide-char versions.
#if(RUN_MP4FILE_TESTCASES)
#undef DEFAULT_3GPPDL_URL
#define DEFAULT_3GPPDL_URL "http://pvwmsoha.pv.com:7070/MediaDownloadContent/MP4/prog_dl/mpeg4+aac_metadata_qt.mp4"
//#define DEFAULT_3GPPDL_URL "http://pvwmsoha.pv.com:7070/MediaDownloadContent/MP4/prog_dl/ec36-av-clon-100-10-h176x144p-uc-g7a24;16s-rvdqmt.mp4"
#elif(RUN_ASFFILE_TESTCASES)
#undef DEFAULT_3GPPDL_URL
#define DEFAULT_3GPPDL_URL "http://pvwmsoha.pv.com:7070/MediaDownloadContent/UserUploads/av5.wmv"
#endif
#if(RUN_ASFFILE_TESTCASES)
//For slow download use this one
#define DEFAULT_3GPPDL_URL_SLOW "http://reallinux.pv.com:1415/av5.wmv?bitrate=100000"
#elif (RUN_MP4FILE_TESTCASES)
#define DEFAULT_3GPPDL_URL_SLOW "http://reallinux.pv.com:1415/at_vh264qc128_1_amr_12.2_of.3gp?bitrate=100000"
#endif
//Default Bad URL for the error-case test
#define DEFAULT_BADURL "http://reallinux.pv.com:1415/xxxxx_320x240_15fps_200kbps_wmv7.wmv"
#define DEFAULT_TRUNCATED_TEST_URL "http://reallinux.pv.com:1415/av5.wmv?no_content_length=true"
#define DEFAULT_CANCEL_DURING_INIT_TEST_URL "http://reallinux.pv.com:1415/av5.wmv?bitrate=1000"
#define DEFAULT_CANCEL_DURING_INIT_DELAY_TEST_URL "http://reallinux.pv.com:1415/blz4-110302-aac-h263.mp4?bitrate=1000000"
#define DEFAULT_3GPP_PPB_URL "http://pvwmsoha.pv.com:7070/MediaDownloadContent/UserUploads/youtube_singer.3gp"
extern FILE* file;
//#define USING_PROXY
//
//pvplayer_async_test_downloadbase section
//
pvplayer_async_test_downloadbase::~pvplayer_async_test_downloadbase()
{
delete iDownloadContextData;
}
void pvplayer_async_test_downloadbase::PrintMetadata()
{
for (uint32 i = 0;i < iMetadataValueList.size();i++)
{
if (!iMetadataValueList[i].key)
{
fprintf(file, " Metadata Key Missing!, value ?\n");
PVPATB_TEST_IS_TRUE(false);
}
else if (oscl_strstr(iMetadataValueList[i].key, "valtype=char*"))
{
fprintf(file, " Metadata Key '%s', value '%s'\n", iMetadataValueList[i].key, iMetadataValueList[i].value.pChar_value);
}
else if (oscl_strstr(iMetadataValueList[i].key, "valtype=wchar*"))
{
OSCL_HeapString<OsclMemAllocator> ostr;
char buf[2];
buf[1] = '\0';
for (uint32 j = 0;;j++)
{
if (iMetadataValueList[i].value.pWChar_value[j] == '\0')
break;
buf[0] = iMetadataValueList[i].value.pWChar_value[j];
ostr += buf;
}
fprintf(file, " Metadata Key '%s', value '%s'\n", iMetadataValueList[i].key, ostr.get_str());
}
else if (oscl_strstr(iMetadataValueList[i].key, "valtype=uint32"))
{
fprintf(file, " Metadata Key '%s', value %d\n", iMetadataValueList[i].key, iMetadataValueList[i].value.uint32_value);
}
else if (oscl_strstr(iMetadataValueList[i].key, "valtype=bool"))
{
fprintf(file, " Metadata Key '%s', value %d\n", iMetadataValueList[i].key, iMetadataValueList[i].value.bool_value);
}
else if (oscl_strstr(iMetadataValueList[i].key, "valtype=uint8*"))
{
fprintf(file, " Metadata Key '%s', len %d\n", iMetadataValueList[i].key, iMetadataValueList[i].length);
}
else
{
fprintf(file, " Metadata Key '%s', value ?\n", iMetadataValueList[i].key);
}
if ((oscl_strstr(iMetadataValueList[i].key, "duration")) && iSessionDuration == 0)
{
iSessionDuration = iMetadataValueList[i].value.uint32_value;
// Check the timescale. If not available, assume millisecond (1000)
const char *retTSstr;
retTSstr = oscl_strstr(iMetadataValueList[i].key, "timescale=");
uint32 retTSstrLen = 0;
uint32 tsstrlen = oscl_strlen(_STRLIT_CHAR("timescale="));
if (retTSstr != NULL)
{
retTSstrLen = oscl_strlen(retTSstr);
if (retTSstrLen > tsstrlen)
{
uint32 timescale = 0;
PV_atoi((char*)(retTSstr + tsstrlen), 'd', (retTSstrLen - tsstrlen), timescale);
if (timescale > 0 && timescale != 1000)
{
// Convert to milliseconds
MediaClockConverter mcc(timescale);
mcc.update_clock(iSessionDuration);
iSessionDuration = mcc.get_converted_ts(1000);
}
}
}
}
}
fprintf(file, "\n\n");
}
void pvplayer_async_test_downloadbase::StartTest()
{
AddToScheduler();
iState = STATE_CREATE;
RunIfNotReady();
}
void pvplayer_async_test_downloadbase::Run()
{
int error = 0;
switch (iState)
{
case STATE_CREATE:
{
iPlayer = NULL;
OSCL_TRY(error, iPlayer = PVPlayerFactory::CreatePlayer(this, this, this));
if (error)
{
PVPATB_TEST_IS_TRUE(false);
iObserver->TestCompleted(*iTestCase);
}
else
{
iState = STATE_QUERYINTERFACE;
RunIfNotReady();
}
}
break;
case STATE_QUERYINTERFACE:
{
fprintf(iTestMsgOutputFile, "***Query Interface...\n");
PVUuid capconfigifuuid = PVMI_CAPABILITY_AND_CONFIG_PVUUID;
OSCL_TRY(error, iCurrentCmdId = iPlayer->QueryInterface(capconfigifuuid, (PVInterface*&)iPlayerCapConfigIF, (OsclAny*) & iContextObject));
OSCL_FIRST_CATCH_ANY(error, PVPATB_TEST_IS_TRUE(false); iState = STATE_CLEANUPANDCOMPLETE; RunIfNotReady());
}
break;
case STATE_ADDDATASOURCE:
CreateDataSource();
OSCL_TRY(error, iCurrentCmdId = iPlayer->AddDataSource(*iDataSource, (OsclAny*) & iContextObject));
OSCL_FIRST_CATCH_ANY(error, PVPATB_TEST_IS_TRUE(false); iState = STATE_CLEANUPANDCOMPLETE; RunIfNotReady());
break;
case STATE_CONFIGPARAMS:
{
fprintf(iTestMsgOutputFile, "***Configuring Params...\n");
//set user-agent, make sure to set as "PVPLAYER VersionNumber" to satisfy Fast Track PV server for Fast Track test
iKeyStringSetAsync = _STRLIT_CHAR("x-pvmf/net/user-agent;valtype=wchar*;mode=download");
iKVPSetAsync.key = iKeyStringSetAsync.get_str();
// OSCL_wHeapString<OsclMemAllocator> userAgent(_STRLIT_WCHAR("PVPLAYER 18akljfaljfa"));
OSCL_wHeapString<OsclMemAllocator> userAgent(_STRLIT_WCHAR("PVPLAYER 18.07.00.02"));
iKVPSetAsync.value.pWChar_value = userAgent.get_str();
iErrorKVP = NULL;
OSCL_TRY(error, iPlayerCapConfigIF->setParametersSync(NULL, &iKVPSetAsync, 1, iErrorKVP));
OSCL_FIRST_CATCH_ANY(error, PVPATB_TEST_IS_TRUE(false); iState = STATE_CLEANUPANDCOMPLETE; RunIfNotReady(); return);
// set http version number
iKeyStringSetAsync = _STRLIT_CHAR("x-pvmf/net/http-version;valtype=uint32");
iKVPSetAsync.key = iKeyStringSetAsync.get_str();
iKVPSetAsync.value.uint32_value = 0;
iErrorKVP = NULL;
OSCL_TRY(error, iPlayerCapConfigIF->setParametersSync(NULL, &iKVPSetAsync, 1, iErrorKVP));
OSCL_FIRST_CATCH_ANY(error, PVPATB_TEST_IS_TRUE(false); iState = STATE_CLEANUPANDCOMPLETE; RunIfNotReady(); return);
// set http timeout
iKeyStringSetAsync = _STRLIT_CHAR("x-pvmf/net/http-timeout;valtype=uint32");
iKVPSetAsync.key = iKeyStringSetAsync.get_str();
iKVPSetAsync.value.uint32_value = 20;
iErrorKVP = NULL;
OSCL_TRY(error, iPlayerCapConfigIF->setParametersSync(NULL, &iKVPSetAsync, 1, iErrorKVP));
OSCL_FIRST_CATCH_ANY(error, PVPATB_TEST_IS_TRUE(false); iState = STATE_CLEANUPANDCOMPLETE; RunIfNotReady(); return);
// set number of redirects
iKeyStringSetAsync = _STRLIT_CHAR("x-pvmf/net/num-redirect-attempts;valtype=uint32");
iKVPSetAsync.key = iKeyStringSetAsync.get_str();
iKVPSetAsync.value.uint32_value = 4;
iErrorKVP = NULL;
OSCL_TRY(error, iPlayerCapConfigIF->setParametersSync(NULL, &iKVPSetAsync, 1, iErrorKVP));
OSCL_FIRST_CATCH_ANY(error, PVPATB_TEST_IS_TRUE(false); iState = STATE_CLEANUPANDCOMPLETE; RunIfNotReady(); return);
// set extension header
// set arbitrary extension header one by one
iKeyStringSetAsync = _STRLIT_CHAR("x-pvmf/net/protocol-extension-header;valtype=char*");
iKVPSetAsync.key = iKeyStringSetAsync.get_str();
OSCL_HeapString<OsclMemAllocator> protocolExtensionHeader(_STRLIT_CHAR("key=PVPlayerCoreEngineTest;value=Test;method=GET,HEAD"));
iKVPSetAsync.value.pChar_value = protocolExtensionHeader.get_str();
iKVPSetAsync.capacity = protocolExtensionHeader.get_size();
iErrorKVP = NULL;
OSCL_TRY(error, iPlayerCapConfigIF->setParametersSync(NULL, &iKVPSetAsync, 1, iErrorKVP));
OSCL_FIRST_CATCH_ANY(error, PVPATB_TEST_IS_TRUE(false); iState = STATE_CLEANUPANDCOMPLETE; RunIfNotReady(); return);
iKeyStringSetAsync = _STRLIT_CHAR("x-pvmf/net/protocol-extension-header;valtype=char*");
iKVPSetAsync.key = iKeyStringSetAsync.get_str();
OSCL_HeapString<OsclMemAllocator> protocolExtensionHeaderGet(_STRLIT_CHAR("key=PVPlayerCoreEngineTest;value=GetHeader;method=GET"));
iKVPSetAsync.value.pChar_value = protocolExtensionHeaderGet.get_str();
iKVPSetAsync.capacity = protocolExtensionHeaderGet.get_size();
iErrorKVP = NULL;
OSCL_TRY(error, iPlayerCapConfigIF->setParametersSync(NULL, &iKVPSetAsync, 1, iErrorKVP));
OSCL_FIRST_CATCH_ANY(error, PVPATB_TEST_IS_TRUE(false); iState = STATE_CLEANUPANDCOMPLETE; RunIfNotReady(); return);
iKeyStringSetAsync = _STRLIT_CHAR("x-pvmf/net/protocol-extension-header;valtype=char*");
iKVPSetAsync.key = iKeyStringSetAsync.get_str();
OSCL_HeapString<OsclMemAllocator> protocolExtensionHeaderHead(_STRLIT_CHAR("key=PVPlayerCoreEngineTest;value=HeadHeader;method=HEAD"));
iKVPSetAsync.value.pChar_value = protocolExtensionHeaderHead.get_str();
iKVPSetAsync.capacity = protocolExtensionHeaderHead.get_size();
iErrorKVP = NULL;
OSCL_TRY(error, iPlayerCapConfigIF->setParametersSync(NULL, &iKVPSetAsync, 1, iErrorKVP));
OSCL_FIRST_CATCH_ANY(error, PVPATB_TEST_IS_TRUE(false); iState = STATE_CLEANUPANDCOMPLETE; RunIfNotReady(); return);
// Unnecessary Header should not display
iKeyStringSetAsync = _STRLIT_CHAR("x-pvmf/net/protocol-extension-header;valtype=char*");
iKVPSetAsync.key = iKeyStringSetAsync.get_str();
OSCL_HeapString<OsclMemAllocator> protocolExtensionHeaderPost(_STRLIT_CHAR("key=PVPlayerCoreEngineTest;value=PostHeader;method=POST"));
iKVPSetAsync.value.pChar_value = protocolExtensionHeaderPost.get_str();
iKVPSetAsync.capacity = protocolExtensionHeaderPost.get_size();
iErrorKVP = NULL;
OSCL_TRY(error, iPlayerCapConfigIF->setParametersSync(NULL, &iKVPSetAsync, 1, iErrorKVP));
OSCL_FIRST_CATCH_ANY(error, PVPATB_TEST_IS_TRUE(false); iState = STATE_CLEANUPANDCOMPLETE; RunIfNotReady(); return);
// set extension header
// set arbitrary extension headers all together
PvmiKvp kvpheader[3];
//OSCL_StackString<128> paramkey(_STRLIT_CHAR("x-pvmf/net/protocol-extension-header;valtype=char*;mode=download"));
OSCL_StackString<128> paramkey(_STRLIT_CHAR("x-pvmf/net/protocol-extension-header;valtype=char*;mode=download;purge-on-redirect"));
//OSCL_StackString<128> paramkey(_STRLIT_CHAR("x-pvmf/net/protocol-extension-header;valtype=char*;purge-on-redirect"));
//OSCL_StackString<128> paramkey(_STRLIT_CHAR("x-pvmf/net/protocol-extension-header;valtype=char*"));
//OSCL_StackString<128> paramkey(_STRLIT_CHAR("x-pvmf/net/protocol-extension-header;valtype=char*;mode=streaming"));
kvpheader[0].key = paramkey.get_str();
OSCL_HeapString<OsclMemAllocator> protocolExtensionHeader1(_STRLIT_CHAR("key=X1;value=Y1;method=GET,HEAD"));
kvpheader[0].value.pChar_value = protocolExtensionHeader1.get_str();
kvpheader[0].capacity = protocolExtensionHeader1.get_size();
kvpheader[1].key = paramkey.get_str();
OSCL_HeapString<OsclMemAllocator> protocolExtensionHeaderGet1(_STRLIT_CHAR("key=X2;value=Y2;method=GET"));
kvpheader[1].value.pChar_value = protocolExtensionHeaderGet1.get_str();
kvpheader[1].capacity = protocolExtensionHeaderGet1.get_size();
kvpheader[2].key = paramkey.get_str();
OSCL_HeapString<OsclMemAllocator> protocolExtensionHeaderHead1(_STRLIT_CHAR("key=X3;value=Y3;method=HEAD"));
kvpheader[2].value.pChar_value = protocolExtensionHeaderHead1.get_str();
kvpheader[2].capacity = protocolExtensionHeaderHead1.get_size();
OSCL_TRY(error, iPlayerCapConfigIF->setParametersSync(NULL, kvpheader, 3, iErrorKVP));
OSCL_FIRST_CATCH_ANY(error, PVPATB_TEST_IS_TRUE(false); iState = STATE_CLEANUPANDCOMPLETE; RunIfNotReady(); return);
// enable or disable HEAD request
iKeyStringSetAsync = _STRLIT_CHAR("x-pvmf/net/http-header-request-disabled;valtype=bool");
iKVPSetAsync.key = iKeyStringSetAsync.get_str();
iKVPSetAsync.value.bool_value = true;
iErrorKVP = NULL;
OSCL_TRY(error, iPlayerCapConfigIF->setParametersSync(NULL, &iKVPSetAsync, 1, iErrorKVP));
OSCL_FIRST_CATCH_ANY(error, PVPATB_TEST_IS_TRUE(false); iState = STATE_CLEANUPANDCOMPLETE; RunIfNotReady(); return);
iKeyStringSetAsync = _STRLIT_CHAR("x-pvmf/net/max-tcp-recv-buffer-size-download;valtype=uint32");
iKVPSetAsync.key = iKeyStringSetAsync.get_str();
iKVPSetAsync.value.uint32_value = 64000;
iErrorKVP = NULL;
OSCL_TRY(error, iPlayerCapConfigIF->setParametersSync(NULL, &iKVPSetAsync, 1, iErrorKVP));
OSCL_FIRST_CATCH_ANY(error, PVPATB_TEST_IS_TRUE(false); iState = STATE_CLEANUPANDCOMPLETE; RunIfNotReady(); return);
//set number of TCP recv buffers for progressive playback.
if (iDownloadContextData
&& iDownloadContextData->DownloadHTTPData()
&& iDownloadContextData->DownloadHTTPData()->iPlaybackControl == PVMFSourceContextDataDownloadHTTP::ENoSaveToFile)
{
iKeyStringSetAsync = _STRLIT_CHAR("x-pvmf/net/max-tcp-recv-buffer-count-download;valtype=uint32");
iKVPSetAsync.key = iKeyStringSetAsync.get_str();
iKVPSetAsync.value.uint32_value = 8;
iErrorKVP = NULL;
OSCL_TRY(error, iPlayerCapConfigIF->setParametersSync(NULL, &iKVPSetAsync, 1, iErrorKVP));
OSCL_FIRST_CATCH_ANY(error, PVPATB_TEST_IS_TRUE(false); iState = STATE_CLEANUPANDCOMPLETE; RunIfNotReady(); return);
}
/////////////////////////////////////////////////////////
iKeyStringSetAsync = _STRLIT_CHAR("x-pvmf/net/protocol-extension-header;valtype=char*;purge-on-redirect");
iKVPSetAsync.key = iKeyStringSetAsync.get_str();
OSCL_HeapString<OsclMemAllocator> protocolExtensionHeaderCookie(_STRLIT_CHAR("key=Cookie; value=key1=value1; key2=value2"));
iKVPSetAsync.value.pChar_value = protocolExtensionHeaderCookie.get_str();
iKVPSetAsync.capacity = protocolExtensionHeaderCookie.get_size();
iErrorKVP = NULL;
OSCL_TRY(error, iPlayerCapConfigIF->setParametersSync(NULL, &iKVPSetAsync, 1, iErrorKVP));
OSCL_FIRST_CATCH_ANY(error, PVPATB_TEST_IS_TRUE(false); iState = STATE_CLEANUPANDCOMPLETE; RunIfNotReady(); return);
/////////////////////////////////////////////////////////
iState = STATE_INIT;
RunIfNotReady();
}
break;
case STATE_INIT:
{
OSCL_TRY(error, iCurrentCmdId = iPlayer->Init((OsclAny*) & iContextObject));
OSCL_FIRST_CATCH_ANY(error, PVPATB_TEST_IS_TRUE(false); iState = STATE_CLEANUPANDCOMPLETE; RunIfNotReady());
}
break;
case STATE_WAIT_FOR_BUFFCOMPLETE:
if (iNumBufferingComplete > 0)
{
//Download is complete!
if (iDownloadOnly)
{
//download-only cases can finish now.
iState = STATE_RESET;
RunIfNotReady();
}
else
{
if (iPauseAfterDownloadComplete == true)
{
iState = STATE_PAUSE;
RunIfNotReady(5*1000*1000);
}
else if (iRepositionAfterDownloadComplete == true)
{
iState = STATE_SETPLAYBACKRANGE;
RunIfNotReady();
}
else
{
//playback cases play 10 more seconds then stop.
iState = STATE_STOP;
if (iPlayUntilEOS == false)
{
RunIfNotReady(10*1000*1000);
}
else
{
//wait for EOS
}
if (iPauseResumeAfterUnderflow == true)
{
fprintf(file, "\n Buffering Complete before Underflow event, pass the test case but Scenario not tested\n\n");
// pass the test case but scenario is not tested, print a message for the user,
// now either play for 5 seconds or wait till the EOS.
}
}
}
}
else
{
//timed out while waiting.
PVPATB_TEST_IS_TRUE(false);
iState = STATE_CLEANUPANDCOMPLETE;
RunIfNotReady();
}
break;
case STATE_ADDDATASINK_VIDEO:
{
CreateDataSinkVideo();
OSCL_TRY(error, iCurrentCmdId = iPlayer->AddDataSink(*iDataSinkVideo, (OsclAny*) & iContextObject));
OSCL_FIRST_CATCH_ANY(error, PVPATB_TEST_IS_TRUE(false); iState = STATE_CLEANUPANDCOMPLETE; RunIfNotReady());
}
break;
case STATE_ADDDATASINK_AUDIO:
{
CreateDataSinkAudio();
OSCL_TRY(error, iCurrentCmdId = iPlayer->AddDataSink(*iDataSinkAudio, (OsclAny*) & iContextObject));
OSCL_FIRST_CATCH_ANY(error, PVPATB_TEST_IS_TRUE(false); iState = STATE_CLEANUPANDCOMPLETE; RunIfNotReady());
}
break;
case STATE_PREPARE:
case STATE_PREPARE2:
{
fprintf(iTestMsgOutputFile, "***Preparing\n");
OSCL_TRY(error, iCurrentCmdId = iPlayer->Prepare((OsclAny*) & iContextObject));
OSCL_FIRST_CATCH_ANY(error, PVPATB_TEST_IS_TRUE(false); iState = STATE_CLEANUPANDCOMPLETE; RunIfNotReady());
}
break;
case STATE_GETMETADATAKEYLIST:
{
iMetadataKeyList.clear();
OSCL_TRY(error, iCurrentCmdId = iPlayer->GetMetadataKeys(iMetadataKeyList, 0, 100, NULL, (OsclAny*) & iContextObject));
OSCL_FIRST_CATCH_ANY(error, PVPATB_TEST_IS_TRUE(false); iState = STATE_CLEANUPANDCOMPLETE; RunIfNotReady());
}
break;
case STATE_GETMETADATAVALUELIST:
{
iMetadataValueList.clear();
iNumValues = 0;
OSCL_TRY(error, iCurrentCmdId = iPlayer->GetMetadataValues(iMetadataKeyList, 0, 100, iNumValues, iMetadataValueList, (OsclAny*) & iContextObject));
OSCL_FIRST_CATCH_ANY(error, PVPATB_TEST_IS_TRUE(false); iState = STATE_CLEANUPANDCOMPLETE; RunIfNotReady());
}
break;
case STATE_WAIT_FOR_DATAREADY:
{
if (iNumDataReady > 0)
{
//playback cases wait on data ready, then start engine.
iState = STATE_START;
RunIfNotReady();
}
else
{
//timed out while waiting.
PVPATB_TEST_IS_TRUE(false);
iState = STATE_CLEANUPANDCOMPLETE;
RunIfNotReady();
}
}
break;
case STATE_START:
case STATE_START2:
{
fprintf(iTestMsgOutputFile, "***Starting\n");
OSCL_TRY(error, iCurrentCmdId = iPlayer->Start((OsclAny*) & iContextObject));
OSCL_FIRST_CATCH_ANY(error, PVPATB_TEST_IS_TRUE(false); iState = STATE_CLEANUPANDCOMPLETE; RunIfNotReady());
}
break;
case STATE_PAUSE:
{
fprintf(iTestMsgOutputFile, "***Pausing\n");
OSCL_TRY(error, iCurrentCmdId = iPlayer->Pause((OsclAny*) & iContextObject));
OSCL_FIRST_CATCH_ANY(error, PVPATB_TEST_IS_TRUE(false); iState = STATE_CLEANUPANDCOMPLETE; RunIfNotReady());
}
break;
case STATE_RESUME:
{
fprintf(iTestMsgOutputFile, "***Resuming...\n");
OSCL_TRY(error, iCurrentCmdId = iPlayer->Resume((OsclAny*) & iContextObject));
OSCL_FIRST_CATCH_ANY(error, PVPATB_TEST_IS_TRUE(false); iState = STATE_CLEANUPANDCOMPLETE; RunIfNotReady());
}
break;
case STATE_SETPLAYBACKRANGE:
{
if (iSessionDuration > 0)
{
fprintf(iTestMsgOutputFile, "***Repositioning to %d ms\n", (iSessionDuration / 4));
PVPPlaybackPosition start, end;
start.iIndeterminate = false;
start.iPosUnit = PVPPBPOSUNIT_MILLISEC;
start.iMode = PVPPBPOS_MODE_NOW;
start.iPosValue.millisec_value = iSessionDuration / 4;
end.iIndeterminate = true;
OSCL_TRY(error, iCurrentCmdId = iPlayer->SetPlaybackRange(start, end, false, (OsclAny*) & iContextObject));
OSCL_FIRST_CATCH_ANY(error, PVPATB_TEST_IS_TRUE(false); iState = STATE_CLEANUPANDCOMPLETE; RunIfNotReady());
}
else
{
fprintf(iTestMsgOutputFile, "***Set PlayBack Range Not Supported for a session with unknown duration...\n");
//just play for 10 seconds then stop
iState = STATE_STOP;
RunIfNotReady(10*1000*1000);
}
}
break;
case STATE_STOP:
case STATE_STOP2:
{
fprintf(iTestMsgOutputFile, "***Stopping\n");
OSCL_TRY(error, iCurrentCmdId = iPlayer->Stop((OsclAny*) & iContextObject));
OSCL_FIRST_CATCH_ANY(error, PVPATB_TEST_IS_TRUE(false); iState = STATE_CLEANUPANDCOMPLETE; RunIfNotReady());
}
break;
case STATE_REMOVEDATASINK_VIDEO:
{
OSCL_TRY(error, iCurrentCmdId = iPlayer->RemoveDataSink(*iDataSinkVideo, (OsclAny*) & iContextObject));
OSCL_FIRST_CATCH_ANY(error, PVPATB_TEST_IS_TRUE(false); iState = STATE_CLEANUPANDCOMPLETE; RunIfNotReady());
}
break;
case STATE_REMOVEDATASINK_AUDIO:
{
OSCL_TRY(error, iCurrentCmdId = iPlayer->RemoveDataSink(*iDataSinkAudio, (OsclAny*) & iContextObject));
OSCL_FIRST_CATCH_ANY(error, PVPATB_TEST_IS_TRUE(false); iState = STATE_CLEANUPANDCOMPLETE; RunIfNotReady());
}
break;
case STATE_RESET:
{
fprintf(iTestMsgOutputFile, "***Resetting\n");
OSCL_TRY(error, iCurrentCmdId = iPlayer->Reset((OsclAny*) & iContextObject));
OSCL_FIRST_CATCH_ANY(error, PVPATB_TEST_IS_TRUE(false); iState = STATE_CLEANUPANDCOMPLETE; RunIfNotReady());
}
break;
case STATE_REMOVEDATASOURCE:
{
OSCL_TRY(error, iCurrentCmdId = iPlayer->RemoveDataSource(*iDataSource, (OsclAny*) & iContextObject));
OSCL_FIRST_CATCH_ANY(error, PVPATB_TEST_IS_TRUE(false); iState = STATE_CLEANUPANDCOMPLETE; RunIfNotReady());
}
break;
case STATE_CLEANUPANDCOMPLETE:
{
fprintf(file, "Events:\n");
fprintf(file, " Num BuffStart %d\n", iNumBufferingStart);
fprintf(file, " Num BuffComplete %d\n", iNumBufferingComplete);
fprintf(file, " Num Data Ready %d\n", iNumDataReady);
fprintf(file, " Num Underflow %d\n", iNumUnderflow);
PVPATB_TEST_IS_TRUE(PVPlayerFactory::DeletePlayer(iPlayer));
iPlayer = NULL;
delete iDataSource;
iDataSource = NULL;
delete iDataSinkVideo;
iDataSinkVideo = NULL;
delete iDataSinkAudio;
iDataSinkAudio = NULL;
PVMediaOutputNodeFactory::DeleteMediaOutputNode(iIONodeVideo);
iIONodeVideo = NULL;
PVMediaOutputNodeFactory::DeleteMediaOutputNode(iIONodeAudio);
iIONodeAudio = NULL;
iMioFactory->DestroyVideoOutput(iMIOFileOutVideo);
iMIOFileOutVideo = NULL;
iMioFactory->DestroyAudioOutput(iMIOFileOutAudio);
iMIOFileOutAudio = NULL;
//call the test-case specific cleanup.
CleanupData();
iObserver->TestCompleted(*iTestCase);
}
break;
case STATE_CANCELALL: //Added for the derived class pvplayer_async_test_cnclall_prtcl_rllovr
{
fprintf(iTestMsgOutputFile, "***CancelAllCommands...\n");
OSCL_TRY(error, iCancelAllCmdId = iPlayer->CancelAllCommands((OsclAny*) & iContextObject));
OSCL_FIRST_CATCH_ANY(error, PVPATB_TEST_IS_TRUE(false); iState = STATE_CLEANUPANDCOMPLETE; RunIfNotReady());
iState = STATE_WAIT_FOR_CANCELALL;
RunIfNotReady(1000 * 1000 * 10); //if cancell all doesnt get completed in 10 sec, assume failure
}
break;
case STATE_WAIT_FOR_CANCELALL:
{
fprintf(iTestMsgOutputFile, "***Cancel did not complete in time...\n");
// Cancel did not complete in time
PVPATB_TEST_IS_TRUE(false);
iState = STATE_CLEANUPANDCOMPLETE;
RunIfNotReady();
}
break;
default:
break;
}
}
void pvplayer_async_test_downloadbase::CommandCompleted(const PVCmdResponse& aResponse)
{
if (aResponse.GetCmdId() != iCurrentCmdId)
{
// Wrong command ID.
PVPATB_TEST_IS_TRUE(false);
iState = STATE_CLEANUPANDCOMPLETE;
RunIfNotReady();
return;
}
if (aResponse.GetContext() != NULL)
{
if (aResponse.GetContext() == (OsclAny*)&iContextObject)
{
if (iContextObject != iContextObjectRefValue)
{
// Context data value was corrupted
PVPATB_TEST_IS_TRUE(false);
iState = STATE_CLEANUPANDCOMPLETE;
RunIfNotReady();
return;
}
}
else
{
// Context data pointer was corrupted
PVPATB_TEST_IS_TRUE(false);
iState = STATE_CLEANUPANDCOMPLETE;
RunIfNotReady();
return;
}
}
//#if(RUN_CPMJANUS_TESTCASES)
#if 0
if (aResponse.GetCmdStatus() != PVMFSuccess)
{
PrintJanusError(aResponse);
}
#endif
switch (iState)
{
case STATE_QUERYINTERFACE:
if (aResponse.GetCmdStatus() == PVMFSuccess)
{
iState = STATE_ADDDATASOURCE;
RunIfNotReady();
}
else
{
// QueryInterface failed
PVPATB_TEST_IS_TRUE(false);
iState = STATE_CLEANUPANDCOMPLETE;
RunIfNotReady();
}
break;
case STATE_ADDDATASOURCE:
if (aResponse.GetCmdStatus() == PVMFSuccess)
{
iState = STATE_CONFIGPARAMS;
RunIfNotReady();
}
else
{
// AddDataSource failed
PVPATB_TEST_IS_TRUE(false);
iState = STATE_CLEANUPANDCOMPLETE;
RunIfNotReady();
}
break;
case STATE_CONFIGPARAMS:
iState = STATE_INIT;
RunIfNotReady();
break;
case STATE_INIT:
if (aResponse.GetCmdStatus() == PVMFSuccess)
{
if (iDownloadOnly)
{
//For download-only, just wait on the buffering complete event
//and then reset engine.
if (iNumBufferingComplete > 0)
{
//If the clip is really short it's possible it may
//already be downloaded by now.
iState = STATE_RESET;
RunIfNotReady();
}
else
{
//wait on download to complete.
fprintf(file, "***Wait for BufferingComplete...\n");
iState = STATE_WAIT_FOR_BUFFCOMPLETE;
if (iPlayUntilEOS == false)
{
//5 minute error timeout
RunIfNotReady(5*60*1000*1000);
}
}
}
else
{
//normal playback case, continue to add data sinks.
iState = STATE_ADDDATASINK_VIDEO;
RunIfNotReady();
}
}
else
{
if ((iContentTooLarge) &&
(aResponse.GetCmdStatus() == PVMFErrContentTooLarge))
{
// Test success in this case
fprintf(file, " INIT returned PVMFErrContentTooLarge\n");
PVPATB_TEST_IS_TRUE(true);
iState = STATE_REMOVEDATASOURCE;
RunIfNotReady();
}
else
{
// Init failed
PVPATB_TEST_IS_TRUE(false);
iState = STATE_CLEANUPANDCOMPLETE;
RunIfNotReady();
}
}
break;
case STATE_ADDDATASINK_VIDEO:
if (aResponse.GetCmdStatus() == PVMFSuccess)
{
iState = STATE_ADDDATASINK_AUDIO;
RunIfNotReady();
}
else
{
// AddDataSink failed
PVPATB_TEST_IS_TRUE(false);
iState = STATE_CLEANUPANDCOMPLETE;
RunIfNotReady();
}
break;
case STATE_ADDDATASINK_AUDIO:
if (aResponse.GetCmdStatus() == PVMFSuccess)
{
iState = STATE_PREPARE;
RunIfNotReady();
}
else
{
// AddDataSink failed
PVPATB_TEST_IS_TRUE(false);
iState = STATE_CLEANUPANDCOMPLETE;
RunIfNotReady();
}
break;
case STATE_PREPARE:
if (aResponse.GetCmdStatus() == PVMFSuccess)
{
iState = STATE_GETMETADATAKEYLIST;
RunIfNotReady();
}
else
{
// Prepare failed
PVPATB_TEST_IS_TRUE(false);
iState = STATE_CLEANUPANDCOMPLETE;
RunIfNotReady();
}
break;
case STATE_PREPARE2:
if (aResponse.GetCmdStatus() == PVMFSuccess)
{
iState = STATE_START2;
RunIfNotReady();
}
else
{
// Prepare failed
PVPATB_TEST_IS_TRUE(false);
iState = STATE_CLEANUPANDCOMPLETE;
RunIfNotReady();
}
break;
case STATE_WAIT_FOR_DATAREADY:
case STATE_WAIT_FOR_BUFFCOMPLETE:
//shouldn't get here-- there are no engine commands active in this state.
PVPATB_TEST_IS_TRUE(false);
break;
case STATE_GETMETADATAKEYLIST:
if (aResponse.GetCmdStatus() == PVMFSuccess || aResponse.GetCmdStatus() == PVMFErrArgument)
{
iState = STATE_GETMETADATAVALUELIST;
RunIfNotReady();
}
else
{
// GetMetadataKeys failed
PVPATB_TEST_IS_TRUE(false);
iState = STATE_CLEANUPANDCOMPLETE;
RunIfNotReady();
}
break;
case STATE_GETMETADATAVALUELIST:
if (aResponse.GetCmdStatus() == PVMFSuccess || aResponse.GetCmdStatus() == PVMFErrArgument)
{
//Display the resulting metadata.
PrintMetadata();
//wait for data ready, unless we already got it.
if (iNumDataReady > 0)
{
iState = STATE_START;
RunIfNotReady();
}
else
{
fprintf(file, "***Wait for DataReady...\n");
iState = STATE_WAIT_FOR_DATAREADY;
if (iPlayUntilEOS == false)
{
//5 minute error timeout
RunIfNotReady(5*60*1000*1000);
}
}
}
else
{
// GetMetadataValue failed
PVPATB_TEST_IS_TRUE(false);
iState = STATE_CLEANUPANDCOMPLETE;
RunIfNotReady();
}
break;
case STATE_START:
if (aResponse.GetCmdStatus() == PVMFSuccess)
{
if (iPlayStopPlay)
{
//play for 10 seconds then stop
iState = STATE_STOP;
RunIfNotReady(10*1000*1000);
break;
}
if (iProgPlayback)
{
//play for 10 seconds or until EOS.
iState = STATE_STOP;
if (!iPlayUntilEOS)
RunIfNotReady(10*1000*1000);
break;
}
//most other cases wait for buff complete.
if (iNumBufferingComplete)
{
if (iDownloadThenPlay)
{
if (iPauseAfterDownloadComplete)
{
//play for 5 sec then pause
iState = STATE_PAUSE;
RunIfNotReady(5*1000*1000);
break;
}
else if (iRepositionAfterDownloadComplete)
{
//play for 5 sec then repos
iState = STATE_SETPLAYBACKRANGE;
RunIfNotReady(5*1000*1000);
break;
}
}
//play for 10 sec or until EOS.
iState = STATE_STOP;
if (!iPlayUntilEOS)
RunIfNotReady(10*1000*1000);
break;
}
else
{
//wait for buff complete
iState = STATE_WAIT_FOR_BUFFCOMPLETE;
if (!iPlayUntilEOS)
{
//5 minute error timeout to avoid test case hang.
RunIfNotReady(5*60*1000*1000);
break;
}
}
}
else
{
// Start failed
PVPATB_TEST_IS_TRUE(false);
iState = STATE_CLEANUPANDCOMPLETE;
RunIfNotReady();
}
break;
case STATE_START2:
if (aResponse.GetCmdStatus() == PVMFSuccess)
{
//play for 10 seconds then stop
iState = STATE_STOP2;
RunIfNotReady(10*1000*1000);
break;
}
else
{
// Start failed
PVPATB_TEST_IS_TRUE(false);
iState = STATE_CLEANUPANDCOMPLETE;
RunIfNotReady();
}
break;
case STATE_PAUSE:
if (aResponse.GetCmdStatus() == PVMFSuccess)
{
iState = STATE_RESUME;
if (iPauseResumeAfterUnderflow == true)
RunIfNotReady();
else
/* Stay paused for 10 seconds */
RunIfNotReady(5*1000*1000);
}
else
{
// Pause failed
PVPATB_TEST_IS_TRUE(false);
iState = STATE_CLEANUPANDCOMPLETE;
RunIfNotReady();
}
break;
case STATE_RESUME:
if (aResponse.GetCmdStatus() == PVMFSuccess)
{
if (iPauseResumeAfterUnderflow == false)
{
iState = STATE_STOP;
if (iPlayUntilEOS == false)
{
//just play for 10 seconds then stop
RunIfNotReady(10*1000*1000);
}
else
{
// wait for EOS
}
}
}
else
{
// Resume failed
PVPATB_TEST_IS_TRUE(false);
iState = STATE_CLEANUPANDCOMPLETE;
RunIfNotReady();
}
break;
case STATE_SETPLAYBACKRANGE:
if (aResponse.GetCmdStatus() == PVMFSuccess)
{
fprintf(iTestMsgOutputFile, "***Repositioning Success...\n");
//just play for 10 seconds then stop
iState = STATE_STOP;
RunIfNotReady(10*1000*1000);
}
else
{
fprintf(iTestMsgOutputFile, "***Repositioning Failed...\n");
// Repos failed
PVPATB_TEST_IS_TRUE(false);
iState = STATE_CLEANUPANDCOMPLETE;
RunIfNotReady();
}
break;
case STATE_STOP:
if (aResponse.GetCmdStatus() == PVMFSuccess)
{
if (iPlayStopPlay)
{
iState = STATE_PREPARE2;
RunIfNotReady();
break;
}
iState = STATE_REMOVEDATASINK_VIDEO;
RunIfNotReady();
}
else
{
PVPATB_TEST_IS_TRUE(false);
iState = STATE_CLEANUPANDCOMPLETE;
RunIfNotReady();
}
break;
case STATE_STOP2:
if (aResponse.GetCmdStatus() == PVMFSuccess)
{
iState = STATE_REMOVEDATASINK_VIDEO;
RunIfNotReady();
}
else
{
PVPATB_TEST_IS_TRUE(false);
iState = STATE_CLEANUPANDCOMPLETE;
RunIfNotReady();
}
break;
case STATE_REMOVEDATASINK_VIDEO:
if (aResponse.GetCmdStatus() == PVMFSuccess)
{
iState = STATE_REMOVEDATASINK_AUDIO;
RunIfNotReady();
}
else
{
// RemoveDataSink failed
PVPATB_TEST_IS_TRUE(false);
iState = STATE_CLEANUPANDCOMPLETE;
RunIfNotReady();
}
break;
case STATE_REMOVEDATASINK_AUDIO:
if (aResponse.GetCmdStatus() == PVMFSuccess)
{
iState = STATE_RESET;
RunIfNotReady();
}
else
{
// RemoveDataSink failed
PVPATB_TEST_IS_TRUE(false);
iState = STATE_CLEANUPANDCOMPLETE;
RunIfNotReady();
}
break;
case STATE_RESET:
if (aResponse.GetCmdStatus() == PVMFSuccess)
{
iState = STATE_REMOVEDATASOURCE;
RunIfNotReady();
}
else
{
// Reset failed
PVPATB_TEST_IS_TRUE(false);
iState = STATE_CLEANUPANDCOMPLETE;
RunIfNotReady();
}
break;
case STATE_REMOVEDATASOURCE:
if (aResponse.GetCmdStatus() == PVMFSuccess)
{
PVPATB_TEST_IS_TRUE(true);
iState = STATE_CLEANUPANDCOMPLETE;
RunIfNotReady();
}
else
{
// RemoveDataSource failed
PVPATB_TEST_IS_TRUE(false);
iState = STATE_CLEANUPANDCOMPLETE;
RunIfNotReady();
}
break;
default:
{
// Testing error if this is reached
PVPATB_TEST_IS_TRUE(false);
iState = STATE_CLEANUPANDCOMPLETE;
RunIfNotReady();
}
break;
}
if (aResponse.GetCmdStatus() != PVMFSuccess)
{
PVInterface* iface = (PVInterface*)(aResponse.GetEventExtensionInterface());
if (iface != NULL)
{
PVUuid infomsguuid = PVMFErrorInfoMessageInterfaceUUID;
PVMFErrorInfoMessageInterface* infomsgiface = NULL;
if (iface->queryInterface(infomsguuid, (PVInterface*&)infomsgiface) == true)
{
PVUuid engerruuid;
int32 errCodeEng;
infomsgiface->GetCodeUUID(errCodeEng, engerruuid);
if (engerruuid == PVPlayerErrorInfoEventTypesUUID)
{
PVMFErrorInfoMessageInterface* sourceNodeErrorIF =
infomsgiface->GetNextMessage();
if (sourceNodeErrorIF != NULL)
{
PVUuid eventuuid;
int32 srcErrCode;
sourceNodeErrorIF->GetCodeUUID(srcErrCode, eventuuid);
if (eventuuid == PVMFSocketNodeEventTypeUUID)
{
HandleSocketNodeErrors(srcErrCode);
}
else if (eventuuid == PVProtocolEngineNodeErrorEventTypesUUID)
{
HandleProtocolEngineNodeErrors(srcErrCode, aResponse.GetEventData());
}
}
}
}
}
}
}
void pvplayer_async_test_downloadbase::HandleSocketNodeErrors(int32 aErr)
{
if (aErr == PVMFSocketNodeErrorSocketServerCreateError)
{
fprintf(iTestMsgOutputFile, "PVMFSocketNodeErrorSocketServerCreateError\n");
}
else if (aErr == PVMFSocketNodeErrorSocketServConnectError)
{
fprintf(iTestMsgOutputFile, "PVMFSocketNodeErrorSocketServConnectError\n");
}
else if (aErr == PVMFSocketNodeErrorUDPSocketRecvError)
{
fprintf(iTestMsgOutputFile, "PVMFSocketNodeErrorUDPSocketRecvError\n");
}
else if (aErr == PVMFSocketNodeErrorUDPSocketSendError)
{
fprintf(iTestMsgOutputFile, "PVMFSocketNodeErrorUDPSocketSendError\n");
}
else if (aErr == PVMFSocketNodeError_TCPSocketConnect)
{
fprintf(iTestMsgOutputFile, "PVMFSocketNodeError_TCPSocketConnect\n");
}
else if (aErr == PVMFSocketNodeError_DNSLookup)
{
fprintf(iTestMsgOutputFile, "PVMFSocketNodeError_DNSLookup\n");
}
else if (aErr == PVMFSocketNodeErrorSocketFailure)
{
fprintf(iTestMsgOutputFile, "PVMFSocketNodeErrorSocketFailure\n");
}
else if (aErr == PVMFSocketNodeErrorSocketTimeOut)
{
fprintf(iTestMsgOutputFile, "PVMFSocketNodeErrorSocketTimeOut\n");
}
else if (aErr == PVMFSocketNodeErrorInvalidPortTag)
{
fprintf(iTestMsgOutputFile, "PVMFSocketNodeErrorInvalidPortTag\n");
}
else if (aErr == PVMFSocketNodeErrorInvalidPortConfig)
{
fprintf(iTestMsgOutputFile, "PVMFSocketNodeErrorInvalidPortConfig\n");
}
else
{
fprintf(iTestMsgOutputFile, "PVMFSocketNode- Unknown Error Code\n");
}
}
void pvplayer_async_test_downloadbase::HandleProtocolEngineNodeErrors(int32 aErr, OsclAny* aEventData)
{
// The HTTP status errors are propagated up from the Protocol Engine node and
// are enumerated in pvmf_protocol_engine_node_events.h. The raw value of the error
// code can be calculated as an offset from aErr - PVProtocolEngineNodeErrorEventStart.
if ((aErr >= PVProtocolEngineNodeErrorHTTPErrorCode400) &&
(aErr <= PVProtocolEngineNodeErrorHTTPCode4xxUnknown))
{
if (aErr == PVProtocolEngineNodeErrorHTTPErrorCode401 && aEventData)
{
char *realmString = (char *)aEventData;
fprintf(iTestMsgOutputFile, " PVMFInfoMFFailure (HTTP Status code = 401), realm = %s\n", realmString);
}
else
{
fprintf(iTestMsgOutputFile, "PVProtocolEngineNodeError4xx HTTP Status Code %d\n",
aErr - PVProtocolEngineNodeErrorEventStart);
}
}
else if ((aErr >= PVProtocolEngineNodeErrorHTTPErrorCode500) &&
(aErr < PVProtocolEngineNodeErrorHTTPCode5xxUnknownStart))
{
fprintf(file, " ERROR: PVProtocolEngineNodeError5xx HTTP Status Code %d\n",
aErr - PVProtocolEngineNodeErrorEventStart);
}
else if ((aErr >= PVProtocolEngineNodeErrorHTTPRedirectCodeStart) &&
(aErr <= PVProtocolEngineNodeErrorHTTPRedirectCodeEnd))
{
fprintf(file, " ERROR IN REDIRECT: PVProtocolEngineNodeError3xx HTTP Status Code %d\n",
aErr - PVProtocolEngineNodeErrorEventStart);
}
else if (aErr < PVProtocolEngineNodeErrorNotHTTPErrorStart || aErr > PVProtocolEngineNodeErrorNotHTTPErrorEnd)
{
fprintf(file, " ERROR: PVProtocolEngineNodeError HTTP Unknown Status Code %d\n",
aErr - PVProtocolEngineNodeErrorEventStart);
}
else
{
fprintf(file, " ERROR: PVProtocolEngineNodeError General Error %d\n", aErr);
}
}
void pvplayer_async_test_downloadbase::PrintJanusError(const PVCmdResponse& aResp)
{
OSCL_UNUSED_ARG(aResp);
}
void pvplayer_async_test_downloadbase::HandleErrorEvent(const PVAsyncErrorEvent& aEvent)
{
switch (aEvent.GetEventType())
{
case PVMFErrResourceConfiguration:
// Just log the error
PVPATB_TEST_IS_TRUE(false);
fprintf(file, " GOT PVMFErrResourceConfiguration error event\n");
break;
case PVMFErrResource:
// Just log the error
PVPATB_TEST_IS_TRUE(false);
fprintf(file, " GOT PVMFErrResource error event\n");
break;
case PVMFErrCorrupt:
// Just log the error
PVPATB_TEST_IS_TRUE(false);
fprintf(file, " GOT PVMFErrCorrupt error event\n");
break;
case PVMFErrProcessing:
// Just log the error
PVPATB_TEST_IS_TRUE(false);
fprintf(file, " GOT PVMFErrProcessing error event\n");
break;
case PVMFErrTimeout:
PVPATB_TEST_IS_TRUE(false);
fprintf(file, " GOT PVMFErrTimeout error event");
break;
default:
// Unknown error and just log the error
PVPATB_TEST_IS_TRUE(false);
break;
}
// Wait for engine to handle the error
Cancel();
}
void pvplayer_async_test_downloadbase::HandleInformationalEvent(const PVAsyncInformationalEvent& aEvent)
{
if (aEvent.GetEventType() == PVMFInfoErrorHandlingStart)
{
fprintf(file, "PVMFInfoErrorHandlingStart...\n");
}
if (aEvent.GetEventType() == PVMFInfoErrorHandlingComplete)
{
fprintf(file, "PVMFInfoErrorHandlingComplete...\n");
iState = STATE_CLEANUPANDCOMPLETE;
RunIfNotReady();
}
// Check for EOS event
if (aEvent.GetEventType() == PVMFInfoEndOfData)
{
PVInterface* iface = (PVInterface*)(aEvent.GetEventExtensionInterface());
if (iface == NULL)
{
return;
}
PVUuid infomsguuid = PVMFErrorInfoMessageInterfaceUUID;
PVMFErrorInfoMessageInterface* infomsgiface = NULL;
if (iface->queryInterface(infomsguuid, (PVInterface*&)infomsgiface) == true)
{
int32 infocode;
PVUuid infouuid;
infomsgiface->GetCodeUUID(infocode, infouuid);
if ((infouuid == PVPlayerErrorInfoEventTypesUUID) && (infocode == PVPlayerInfoEndOfClipReached))
{
fprintf(file, " GOT PVPlayerInfoEndOfClipReached EVENT\n");
iNumEOS++;
if (iState == STATE_STOP)
{
Cancel();
RunIfNotReady();
}
}
}
}
//Print some events
switch (aEvent.GetEventType())
{
case PVMFInfoBufferingStatus:
{
int32 *percent = (int32*)aEvent.GetLocalBuffer();
if (iPlayStopPlay)
{
//download percent shouldn't go backward after the re-start,
//since that would suggest we're re-starting the download.
//(don't do this test for PPB case since download gets repositioned
//along with playback.)
if (*percent < iLastBufferingStatusVal && !iProgPlayback)
{
PVPATB_TEST_IS_TRUE(false);
}
}
iLastBufferingStatusVal = *percent;
if (iLastBufferingStatusVal == 0 || iLastBufferingStatusVal == 100)
{
fprintf(file, " PVMFInfoBufferingStatus %d\n", iLastBufferingStatusVal);
}
else
{
fprintf(file, ".%d.", iLastBufferingStatusVal);
}
}
break;
case PVMFInfoBufferingStart:
fprintf(file, " PVMFInfoBufferingStart\n");
iNumBufferingStart++;
if (iPlayStopPlay)
{
//we should only get 1 or 2 of these.
if (iNumBufferingStart == 3)
PVPATB_TEST_IS_TRUE(false);
}
else
{
//we should only get one of these.
if (iNumBufferingStart == 2)
PVPATB_TEST_IS_TRUE(false);
}
break;
case PVMFInfoBufferingComplete:
{
PVExclusivePtr eventData;
aEvent.GetEventData(eventData);
uint32 contentSize = (uint32)(eventData);
fprintf(file, " PVMFInfoBufferingComplete (contentSize=%d)\n", contentSize);
iNumBufferingComplete++;
if (iPlayStopPlay)
{
//we should only get 1 or 2 of these.
if (iNumBufferingComplete == 3)
PVPATB_TEST_IS_TRUE(false);
}
else
{
//we should only get one of these.
if (iNumBufferingComplete == 2)
PVPATB_TEST_IS_TRUE(false);
}
if (iNumBufferingComplete == 1)
{
if (iState == STATE_WAIT_FOR_BUFFCOMPLETE)
{
Cancel();
RunIfNotReady();
}
}
}
break;
case PVMFInfoDataReady:
iNumDataReady++;
fprintf(file, "\n PVMFInfoDataReady\n");
//special handling for very first data ready event.
if (iNumDataReady == 1)
{
if (iState == STATE_WAIT_FOR_DATAREADY)
{
Cancel();
RunIfNotReady();
}
//for download-then-play test, we should not get data ready
//until download is complete
if (iDownloadThenPlay)
{
if (iNumBufferingComplete == 0)
PVPATB_TEST_IS_TRUE(false);
}
//for download-only test, we should not get data ready at all.
if (iDownloadOnly)
{
PVPATB_TEST_IS_TRUE(false);
}
}
break;
case PVMFInfoUnderflow:
iNumUnderflow++;
fprintf(file, "\n PVMFInfoUnderflow\n");
if (iPauseResumeAfterUnderflow == true)
{
iState = STATE_PAUSE;
RunIfNotReady();
}
//we should not get underflow before data ready
if (iNumUnderflow == 1
&& iNumDataReady == 0)
PVPATB_TEST_IS_TRUE(false);
break;
case PVMFInfoContentLength:
{
PVExclusivePtr eventData;
aEvent.GetEventData(eventData);
uint32 contentSize = (uint32)(eventData);
fprintf(file, " PVMFInfoContentLength = %d\n", contentSize);
}
break;
case PVMFInfoContentTruncated:
{
PVExclusivePtr eventData;
aEvent.GetEventData(eventData);
uint32 downloadSize = (uint32)(eventData);
fprintf(file, "\n PVMFInfoContentTruncated! downloadSize = %d\n", downloadSize);
// check extension info code
PVMFErrorInfoMessageInterface *msg = NULL;
if (aEvent.GetEventExtensionInterface() &&
aEvent.GetEventExtensionInterface()->queryInterface(PVMFErrorInfoMessageInterfaceUUID, (PVInterface*&)msg))
{
//extract the event code and event UUID.
int32 eventcode;
PVUuid eventUuid;
msg->GetCodeUUID(eventcode, eventUuid);
if (eventUuid == PVPlayerErrorInfoEventTypesUUID)
{
PVMFErrorInfoMessageInterface* sourceNodeInfoIF = msg->GetNextMessage();
if (sourceNodeInfoIF != NULL)
{
PVUuid infoUUID;
int32 srcInfoCode;
sourceNodeInfoIF->GetCodeUUID(srcInfoCode, infoUUID);
if (infoUUID == PVMFPROTOCOLENGINENODEInfoEventTypesUUID &&
srcInfoCode == PVMFPROTOCOLENGINENODEInfo_TruncatedContentByServerDisconnect)
{
fprintf(file, " PVMFInfoContentTruncated! TruncatedContentByServerDisconnect!\n");
}
}
}
}
}
break;
case PVMFInfoContentType:
{
PVExclusivePtr eventData;
aEvent.GetEventData(eventData);
char *constentType = (char *)(eventData);
fprintf(file, " PVMFInfoContentType = %s\n", constentType);
}
break;
case PVMFInfoUnexpectedData:
fprintf(file, " PVMFInfoUnexpectedData! Downloaded more data than content-length\n");
if (iNumBufferingComplete == 0) PVPATB_TEST_IS_TRUE(false); // we should get this info event after buffer complete event
break;
case PVMFInfoSessionDisconnect:
fprintf(file, " PVMFInfoSessionDisconnect! Got server disconnect after download is complete\n");
if (iNumBufferingComplete == 0) PVPATB_TEST_IS_TRUE(false); // we should get this info event after buffer complete event
break;
case PVMFInfoRemoteSourceNotification:
{
//Examine the extended info message to see if this is the
//"not progressive downloadable" event. If so, notify the
//UI. They may choose to abort the download at this point.
PVMFErrorInfoMessageInterface *msg = NULL;
if (aEvent.GetEventExtensionInterface()
&& aEvent.GetEventExtensionInterface()->queryInterface(PVMFErrorInfoMessageInterfaceUUID, (PVInterface*&)msg))
{
//extract the event code and event UUID.
int32 eventcode;
PVUuid eventUuid;
msg->GetCodeUUID(eventcode, eventUuid);
if (eventUuid == PVPlayerErrorInfoEventTypesUUID)
{
PVMFErrorInfoMessageInterface* sourceNodeInfoIF =
msg->GetNextMessage();
if (sourceNodeInfoIF != NULL)
{
PVUuid infoUUID;
int32 srcInfoCode;
sourceNodeInfoIF->GetCodeUUID(srcInfoCode, infoUUID);
if (infoUUID == PVMFFileFormatEventTypesUUID
&& srcInfoCode == PVMFMP4FFParserInfoNotPseudostreamableFile)
{
fprintf(file, " PVMFInfoRemoteSourceNotification (not progressive-downloadable)\n");
}
else if (infoUUID == PVMFPROTOCOLENGINENODEInfoEventTypesUUID
&& (srcInfoCode >= PVMFPROTOCOLENGINENODEInfo_HTTPRedirectCode300 &&
srcInfoCode <= PVMFPROTOCOLENGINENODEInfo_HTTPRedirectCode307))
{
PVExclusivePtr eventData;
aEvent.GetEventData(eventData);
char *redirectUrl = (char *)(eventData);
fprintf(file, " PVMFInfoRemoteSourceNotification (HTTP Status code = %d), redirectUrl = %s\n",
srcInfoCode - PVMFPROTOCOLENGINENODEInfo_Redirect, redirectUrl);
}
}
}
}
}
break;
case PVMFInfoTrackDisable:
{
PVExclusivePtr aPtr;
aEvent.GetEventData(aPtr);
int32 iDisableTrack = (int32)aPtr;
if (!iDisableTrack)
{
fprintf(iTestMsgOutputFile, "###PVMFInfoTrackDisable - DisableTrack=%d\n", iDisableTrack);
}
}
break;
default:
break;
}
}
#if RUN_FASTTRACK_TESTCASES
//
// pvplayer_async_test_ftdlnormal section
//
pvplayer_async_test_ftdlnormal::~pvplayer_async_test_ftdlnormal()
{
}
void pvplayer_async_test_ftdlnormal::CreateDataSource()
{
//fasttrack download using PVX.
//read the pvx file into a memory fragment.
OsclMemoryFragment pvxmemfrag;
{
Oscl_FileServer fs;
fs.Connect();
Oscl_File file;
OSCL_StackString<64> filename;
if (oscl_strstr(iFileName, DEFAULTSOURCEFILENAME) != NULL)
{
filename = SOURCENAME_PREPEND_STRING;
filename += DEFAULT_FASTTRACK_DL_FILE;
}
else
{
filename = iFileName;
}
if (file.Open(filename.get_str(), Oscl_File::MODE_READ | Oscl_File::MODE_TEXT, fs))
{
PVPATB_TEST_IS_TRUE(false);
iObserver->TestCompleted(*iTestCase);
return;
}
int32 size = file.Read(iPVXFileBuf, 1, 4096);
pvxmemfrag.len = size;
pvxmemfrag.ptr = iPVXFileBuf;
file.Close();
fs.Close();
}
//Parse, extracting iDownloadPvxInfo and url8.
OSCL_HeapString<OsclMemAllocator> url8;
{
CPVXParser* parser = NULL;
parser = new CPVXParser;
if (parser == NULL)
{
PVPATB_TEST_IS_TRUE(false);
iObserver->TestCompleted(*iTestCase);
return;
}
CPVXParser::CPVXParserStatus status = parser->ParsePVX(pvxmemfrag, url8, iDownloadPvxInfo);
delete parser;
if (status != CPVXParser::CPVXParser_Success)
{
PVPATB_TEST_IS_TRUE(false);
iObserver->TestCompleted(*iTestCase);
return;
}
//set the playback mode in the test case base class to match
//the PVX setting.
switch (iDownloadPvxInfo.iPlaybackControl)
{
case CPVXInfo::ENoPlayback:
iDownloadOnly = true;
break;
case CPVXInfo::EAfterDownload:
iDownloadThenPlay = true;
break;
case CPVXInfo::EAsap:
break;
default:
break;
}
}
//convert the url8 to unicode iDownloadURL
{
oscl_wchar* wtemp = new oscl_wchar[url8.get_size()+1];
if (wtemp == NULL)
{
// Memory allocation failure
PVPATB_TEST_IS_TRUE(false);
iObserver->TestCompleted(*iTestCase);
return;
}
int32 wtemplen = oscl_UTF8ToUnicode(url8.get_cstr(), url8.get_size(), wtemp, url8.get_size() + 1);
iDownloadURL.set(wtemp, wtemplen);
delete [] wtemp;
}
//create the opaque data
iDownloadProxy = _STRLIT_CHAR("");
int32 iDownloadProxyPort = 0;
iDownloadConfigFilename = OUTPUTNAME_PREPEND_WSTRING;
iDownloadConfigFilename += _STRLIT_WCHAR("mydlconfig");
iDownloadMaxfilesize = 0x7FFFFFFF;
iDownloadFilename = OUTPUTNAME_PREPEND_WSTRING;
iDownloadFilename += _STRLIT_WCHAR("test_ftdownload.loc");
iContentTooLarge = false;
//bool aIsNewSession = false;
bool aIsNewSession = true;
iDownloadContextData = new PVMFSourceContextData();
iDownloadContextData->EnableCommonSourceContext();
iDownloadContextData->EnableDownloadPVXSourceContext();
iDownloadContextData->DownloadPVXData()->bIsNewSession = aIsNewSession;
iDownloadContextData->DownloadPVXData()->iConfigFileName = iDownloadConfigFilename;
iDownloadContextData->DownloadPVXData()->iDownloadFileName = iDownloadFilename;
iDownloadContextData->DownloadPVXData()->iMaxFileSize = iDownloadMaxfilesize;
iDownloadContextData->DownloadPVXData()->iProxyName = iDownloadProxy;
iDownloadContextData->DownloadPVXData()->iProxyPort = iDownloadProxyPort;
iDownloadContextData->DownloadPVXData()->iPvxInfo = &iDownloadPvxInfo;
iDataSource = new PVPlayerDataSourceURL;
iDataSource->SetDataSourceURL(iDownloadURL);
iDataSource->SetDataSourceFormatType(PVMF_MIME_DATA_SOURCE_PVX_FILE);
iDataSource->SetDataSourceContextData(iDownloadContextData);
}
void pvplayer_async_test_ftdlnormal::CreateDataSinkVideo()
{
OSCL_wHeapString<OsclMemAllocator> sinkfile = OUTPUTNAME_PREPEND_WSTRING;
sinkfile += _STRLIT_WCHAR("test_player_ftdlnormal_video.dat");
iMIOFileOutVideo = iMioFactory->CreateVideoOutput((OsclAny*) & sinkfile, MEDIATYPE_VIDEO, iCompressedVideo);
iIONodeVideo = PVMediaOutputNodeFactory::CreateMediaOutputNode(iMIOFileOutVideo);
iDataSinkVideo = new PVPlayerDataSinkPVMFNode;
((PVPlayerDataSinkPVMFNode*)iDataSinkVideo)->SetDataSinkNode(iIONodeVideo);
}
void pvplayer_async_test_ftdlnormal::CreateDataSinkAudio()
{
OSCL_wHeapString<OsclMemAllocator> sinkfile = OUTPUTNAME_PREPEND_WSTRING;
sinkfile += _STRLIT_WCHAR("test_player_ftdlnormal_audio.dat");
iMIOFileOutAudio = iMioFactory->CreateAudioOutput((OsclAny*) & sinkfile, MEDIATYPE_AUDIO, iCompressedAudio);
iIONodeAudio = PVMediaOutputNodeFactory::CreateMediaOutputNode(iMIOFileOutAudio);
iDataSinkAudio = new PVPlayerDataSinkPVMFNode;
((PVPlayerDataSinkPVMFNode*)iDataSinkAudio)->SetDataSinkNode(iIONodeAudio);
}
#endif
//
// pvplayer_async_test_3gppdlnormal section
//
pvplayer_async_test_3gppdlnormal::~pvplayer_async_test_3gppdlnormal()
{
}
void pvplayer_async_test_3gppdlnormal::CreateDataSource()
{
OSCL_HeapString<OsclMemAllocator> url(iFileName);
OSCL_HeapString<OsclMemAllocator> default_source(SOURCENAME_PREPEND_STRING);
default_source += DEFAULTSOURCEFILENAME;
if (url == default_source)
{
if (iPlayStopPlay)
{//use slow download simulator so we test stop during download.
fprintf(file, "Setting source to %s\n", DEFAULT_3GPPDL_URL_SLOW);
url = DEFAULT_3GPPDL_URL_SLOW;
}
else
{
fprintf(file, "Setting source to %s\n", DEFAULT_3GPPDL_URL);
url = DEFAULT_3GPPDL_URL;
}
}
oscl_wchar wbuf[2];
wbuf[1] = '\0';
for (uint32 i = 0;i < url.get_size();i++)
{
wbuf[0] = (oscl_wchar)url.get_cstr()[i];
iDownloadURL += wbuf;
}
iDataSource = new PVPlayerDataSourceURL;
iDataSource->SetDataSourceURL(iDownloadURL);
if (iProtocolRollOver == true)
{
iDataSource->SetDataSourceFormatType(PVMF_MIME_DATA_SOURCE_MS_HTTP_STREAMING_URL);
iDataSource->SetAlternateSourceFormatType(PVMF_MIME_DATA_SOURCE_HTTP_URL);
}
else
{
iDataSource->SetDataSourceFormatType(PVMF_MIME_DATA_SOURCE_HTTP_URL);
}
iDownloadFilename = OUTPUTNAME_PREPEND_WSTRING;
iDownloadFilename += _STRLIT_WCHAR("test_3gppdownload.loc");
int32 iDownloadProxyPort;
#if PVPLAYER_TEST_ENABLE_PROXY
iDownloadProxy = _STRLIT_CHAR("");
iDownloadProxyPort = 7070;
#else
iDownloadProxy = _STRLIT_CHAR("");
iDownloadProxyPort = 0;
#endif
iDownloadConfigFilename = OUTPUTNAME_PREPEND_WSTRING;
iDownloadConfigFilename += _STRLIT_WCHAR("my3gppdl.cfg");
iContentTooLarge = false;
uint32 iMaxFileSize = 0x7FFFFFFF;
bool aIsNewSession = true;
iDownloadContextData = new PVMFSourceContextData();
iDownloadContextData->EnableCommonSourceContext();
iDownloadContextData->EnableDownloadHTTPSourceContext();
iDownloadContextData->DownloadHTTPData()->bIsNewSession = aIsNewSession;
iDownloadContextData->DownloadHTTPData()->iConfigFileName = iDownloadConfigFilename;
iDownloadContextData->DownloadHTTPData()->iDownloadFileName = iDownloadFilename;
iDownloadContextData->DownloadHTTPData()->iMaxFileSize = iMaxFileSize;
iDownloadContextData->DownloadHTTPData()->iProxyName = iDownloadProxy;
iDownloadContextData->DownloadHTTPData()->iProxyPort = iDownloadProxyPort;
iDownloadContextData->DownloadHTTPData()->iUserID = _STRLIT_CHAR("abc");
iDownloadContextData->DownloadHTTPData()->iUserPasswd = _STRLIT_CHAR("xyz");
iDownloadContextData->DownloadHTTPData()->iPlaybackControl = PVMFSourceContextDataDownloadHTTP::EAsap;
iDownloadContextData->CommonData()->iUseCPMPluginRegistry = iUseCpmForPlayback;
iDataSource->SetDataSourceContextData(iDownloadContextData);
}
#if !(JANUS_IS_LOADABLE_MODULE)
#endif
void pvplayer_async_test_3gppdlnormal::CleanupData()
{
}
void pvplayer_async_test_3gppdlnormal::CreateDataSinkVideo()
{
OSCL_wHeapString<OsclMemAllocator> sinkfile = OUTPUTNAME_PREPEND_WSTRING;
sinkfile += _STRLIT_WCHAR("test_player_3gppdlnormal_video.dat");
iMIOFileOutVideo = iMioFactory->CreateVideoOutput((OsclAny*) & sinkfile, MEDIATYPE_VIDEO, iCompressedVideo);
iIONodeVideo = PVMediaOutputNodeFactory::CreateMediaOutputNode(iMIOFileOutVideo);
iDataSinkVideo = new PVPlayerDataSinkPVMFNode;
((PVPlayerDataSinkPVMFNode*)iDataSinkVideo)->SetDataSinkNode(iIONodeVideo);
}
void pvplayer_async_test_3gppdlnormal::CreateDataSinkAudio()
{
OSCL_wHeapString<OsclMemAllocator> sinkfile = OUTPUTNAME_PREPEND_WSTRING;
sinkfile += _STRLIT_WCHAR("test_player_3gppdlnormal_audio.dat");
iMIOFileOutAudio = iMioFactory->CreateAudioOutput((OsclAny*) & sinkfile, MEDIATYPE_AUDIO, iCompressedAudio);
iIONodeAudio = PVMediaOutputNodeFactory::CreateMediaOutputNode(iMIOFileOutAudio);
iDataSinkAudio = new PVPlayerDataSinkPVMFNode;
((PVPlayerDataSinkPVMFNode*)iDataSinkAudio)->SetDataSinkNode(iIONodeAudio);
}
//
// pvplayer_async_test_ppbnormal section
//
pvplayer_async_test_ppbnormal::~pvplayer_async_test_ppbnormal()
{
}
void pvplayer_async_test_ppbnormal::CreateDataSource()
{
OSCL_HeapString<OsclMemAllocator> url(iFileName);
OSCL_HeapString<OsclMemAllocator> default_source(SOURCENAME_PREPEND_STRING);
default_source += DEFAULTSOURCEFILENAME;
if (url == default_source)
{
fprintf(file, "Setting source to %s\n", DEFAULT_3GPPDL_URL);
url = DEFAULT_3GPPDL_URL;
}
oscl_wchar wbuf[2];
wbuf[1] = '\0';
for (uint32 i = 0;i < url.get_size();i++)
{
wbuf[0] = (oscl_wchar)url.get_cstr()[i];
iDownloadURL += wbuf;
}
iDataSource = new PVPlayerDataSourceURL;
iDataSource->SetDataSourceURL(iDownloadURL);
if (iProtocolRollOver == true)
{
iDataSource->SetDataSourceFormatType(PVMF_MIME_DATA_SOURCE_MS_HTTP_STREAMING_URL);
iDataSource->SetAlternateSourceFormatType(PVMF_MIME_DATA_SOURCE_HTTP_URL);
}
else
{
iDataSource->SetDataSourceFormatType(PVMF_MIME_DATA_SOURCE_HTTP_URL);
}
iDownloadFilename = NULL;
int32 iDownloadProxyPort;
#if PVPLAYER_TEST_ENABLE_PROXY
iDownloadProxy = _STRLIT_CHAR("");
iDownloadProxyPort = 7070;
#else
iDownloadProxy = _STRLIT_CHAR("");
iDownloadProxyPort = 0;
#endif
iDownloadConfigFilename = OUTPUTNAME_PREPEND_WSTRING;
iDownloadConfigFilename += _STRLIT_WCHAR("ppbnormal.cfg");
iContentTooLarge = false;
uint32 iMaxFileSize = 0x7FFFFFFF;
bool aIsNewSession = true;
iDownloadContextData = new PVMFSourceContextData();
iDownloadContextData->EnableCommonSourceContext();
iDownloadContextData->EnableDownloadHTTPSourceContext();
iDownloadContextData->DownloadHTTPData()->bIsNewSession = aIsNewSession;
iDownloadContextData->DownloadHTTPData()->iConfigFileName = iDownloadConfigFilename;
iDownloadContextData->DownloadHTTPData()->iDownloadFileName = iDownloadFilename;
iDownloadContextData->DownloadHTTPData()->iMaxFileSize = iMaxFileSize;
iDownloadContextData->DownloadHTTPData()->iProxyName = iDownloadProxy;
iDownloadContextData->DownloadHTTPData()->iProxyPort = iDownloadProxyPort;
iDownloadContextData->DownloadHTTPData()->iUserID = _STRLIT_CHAR("abc");
iDownloadContextData->DownloadHTTPData()->iUserPasswd = _STRLIT_CHAR("xyz");
iDownloadContextData->DownloadHTTPData()->iPlaybackControl = PVMFSourceContextDataDownloadHTTP::ENoSaveToFile;
iDownloadContextData->CommonData()->iUseCPMPluginRegistry = false;
iDataSource->SetDataSourceContextData(iDownloadContextData);
}
void pvplayer_async_test_ppbnormal::CreateDataSinkVideo()
{
OSCL_wHeapString<OsclMemAllocator> sinkfile = OUTPUTNAME_PREPEND_WSTRING;
sinkfile += _STRLIT_WCHAR("test_player_3gppdlnormal_video.dat");
iMIOFileOutVideo = iMioFactory->CreateVideoOutput((OsclAny*) & sinkfile, MEDIATYPE_VIDEO, iCompressedVideo);
iIONodeVideo = PVMediaOutputNodeFactory::CreateMediaOutputNode(iMIOFileOutVideo);
iDataSinkVideo = new PVPlayerDataSinkPVMFNode;
((PVPlayerDataSinkPVMFNode*)iDataSinkVideo)->SetDataSinkNode(iIONodeVideo);
}
void pvplayer_async_test_ppbnormal::CreateDataSinkAudio()
{
OSCL_wHeapString<OsclMemAllocator> sinkfile = OUTPUTNAME_PREPEND_WSTRING;
sinkfile += _STRLIT_WCHAR("test_player_3gppdlnormal_audio.dat");
iMIOFileOutAudio = iMioFactory->CreateAudioOutput((OsclAny*) & sinkfile, MEDIATYPE_AUDIO, iCompressedAudio);
iIONodeAudio = PVMediaOutputNodeFactory::CreateMediaOutputNode(iMIOFileOutAudio);
iDataSinkAudio = new PVPlayerDataSinkPVMFNode;
((PVPlayerDataSinkPVMFNode*)iDataSinkAudio)->SetDataSinkNode(iIONodeAudio);
}
// pvplayer_async_test_3gppdlnormal_dlthenplay section
//
pvplayer_async_test_3gppdlnormal_dlthenplay::~pvplayer_async_test_3gppdlnormal_dlthenplay()
{
}
void pvplayer_async_test_3gppdlnormal_dlthenplay::CreateDataSource()
{
OSCL_HeapString<OsclMemAllocator> url(iFileName);
OSCL_HeapString<OsclMemAllocator> default_source(SOURCENAME_PREPEND_STRING);
default_source += DEFAULTSOURCEFILENAME;
if (url == default_source)
{
fprintf(file, "Setting source to %s\n", DEFAULT_3GPPDL_URL);
url = DEFAULT_3GPPDL_URL;
}
oscl_wchar wbuf[2];
wbuf[1] = '\0';
for (uint32 i = 0;i < url.get_size();i++)
{
wbuf[0] = (oscl_wchar)url.get_cstr()[i];
iDownloadURL += wbuf;
}
iDataSource = new PVPlayerDataSourceURL;
iDataSource->SetDataSourceURL(iDownloadURL);
iDataSource->SetDataSourceFormatType(PVMF_MIME_DATA_SOURCE_HTTP_URL);
iDownloadFilename = OUTPUTNAME_PREPEND_WSTRING;
iDownloadFilename += _STRLIT_WCHAR("test_3gppdownload_dlthenplay.loc");
int32 iDownloadProxyPort;
#if PVPLAYER_TEST_ENABLE_PROXY
iDownloadProxy = _STRLIT_CHAR("");
iDownloadProxyPort = 7070;
#else
iDownloadProxy = _STRLIT_CHAR("");
iDownloadProxyPort = 0;
#endif
iDownloadConfigFilename = OUTPUTNAME_PREPEND_WSTRING;
iDownloadConfigFilename += _STRLIT_WCHAR("my3gppdl_dlthenplay.cfg");
iContentTooLarge = false;
uint32 iMaxFileSize = 0x7FFFFFFF;
bool aIsNewSession = true;
iDownloadThenPlay = true;
iDownloadContextData = new PVMFSourceContextData();
iDownloadContextData->EnableCommonSourceContext();
iDownloadContextData->EnableDownloadHTTPSourceContext();
iDownloadContextData->DownloadHTTPData()->bIsNewSession = aIsNewSession;
iDownloadContextData->DownloadHTTPData()->iConfigFileName = iDownloadConfigFilename;
iDownloadContextData->DownloadHTTPData()->iDownloadFileName = iDownloadFilename;
iDownloadContextData->DownloadHTTPData()->iMaxFileSize = iMaxFileSize;
iDownloadContextData->DownloadHTTPData()->iProxyName = iDownloadProxy;
iDownloadContextData->DownloadHTTPData()->iProxyPort = iDownloadProxyPort;
iDownloadContextData->DownloadHTTPData()->iPlaybackControl = PVMFSourceContextDataDownloadHTTP::EAfterDownload;
iDownloadContextData->CommonData()->iUseCPMPluginRegistry = false;
iDataSource->SetDataSourceContextData(iDownloadContextData);
}
void pvplayer_async_test_3gppdlnormal_dlthenplay::CreateDataSinkVideo()
{
OSCL_wHeapString<OsclMemAllocator> sinkfile = OUTPUTNAME_PREPEND_WSTRING;
sinkfile += _STRLIT_WCHAR("test_player_3gppdlnormal_dlthenplay_video.dat");
iMIOFileOutVideo = iMioFactory->CreateVideoOutput((OsclAny*) & sinkfile, MEDIATYPE_VIDEO, iCompressedVideo);
iIONodeVideo = PVMediaOutputNodeFactory::CreateMediaOutputNode(iMIOFileOutVideo);
iDataSinkVideo = new PVPlayerDataSinkPVMFNode;
((PVPlayerDataSinkPVMFNode*)iDataSinkVideo)->SetDataSinkNode(iIONodeVideo);
}
void pvplayer_async_test_3gppdlnormal_dlthenplay::CreateDataSinkAudio()
{
OSCL_wHeapString<OsclMemAllocator> sinkfile = OUTPUTNAME_PREPEND_WSTRING;
sinkfile += _STRLIT_WCHAR("test_player_3gppdlnormal_dlthenplay_audio.dat");
iMIOFileOutAudio = iMioFactory->CreateAudioOutput((OsclAny*) & sinkfile, MEDIATYPE_AUDIO, iCompressedAudio);
iIONodeAudio = PVMediaOutputNodeFactory::CreateMediaOutputNode(iMIOFileOutAudio);
iDataSinkAudio = new PVPlayerDataSinkPVMFNode;
((PVPlayerDataSinkPVMFNode*)iDataSinkAudio)->SetDataSinkNode(iIONodeAudio);
}
//
// pvplayer_async_test_3gppdlnormal_dlonly section
//
pvplayer_async_test_3gppdlnormal_dlonly::~pvplayer_async_test_3gppdlnormal_dlonly()
{
}
void pvplayer_async_test_3gppdlnormal_dlonly::CreateDataSource()
{
OSCL_HeapString<OsclMemAllocator> url(iFileName);
OSCL_HeapString<OsclMemAllocator> default_source(SOURCENAME_PREPEND_STRING);
default_source += DEFAULTSOURCEFILENAME;
if (url == default_source)
{
fprintf(file, "Setting source to %s\n", DEFAULT_3GPPDL_URL);
url = DEFAULT_3GPPDL_URL;
}
oscl_wchar wbuf[2];
wbuf[1] = '\0';
for (uint32 i = 0;i < url.get_size();i++)
{
wbuf[0] = (oscl_wchar)url.get_cstr()[i];
iDownloadURL += wbuf;
}
iDataSource = new PVPlayerDataSourceURL;
iDataSource->SetDataSourceURL(iDownloadURL);
iDataSource->SetDataSourceFormatType(PVMF_MIME_DATA_SOURCE_HTTP_URL);
iDownloadFilename = OUTPUTNAME_PREPEND_WSTRING;
iDownloadFilename += _STRLIT_WCHAR("test_3gppdownload_dlonly.loc");
int32 iDownloadProxyPort;
#if PVPLAYER_TEST_ENABLE_PROXY
iDownloadProxy = _STRLIT_CHAR("");
iDownloadProxyPort = 7070;
#else
iDownloadProxy = _STRLIT_CHAR("");
iDownloadProxyPort = 0;
#endif
iDownloadConfigFilename = OUTPUTNAME_PREPEND_WSTRING;
iDownloadConfigFilename += _STRLIT_WCHAR("my3gppdl_dlonly.cfg");
iContentTooLarge = false;
uint32 iMaxFileSize = 0x7FFFFFFF;
bool aIsNewSession = true;
iDownloadOnly = true;
iDownloadContextData = new PVMFSourceContextData();
iDownloadContextData->EnableCommonSourceContext();
iDownloadContextData->EnableDownloadHTTPSourceContext();
iDownloadContextData->DownloadHTTPData()->bIsNewSession = aIsNewSession;
iDownloadContextData->DownloadHTTPData()->iConfigFileName = iDownloadConfigFilename;
iDownloadContextData->DownloadHTTPData()->iDownloadFileName = iDownloadFilename;
iDownloadContextData->DownloadHTTPData()->iMaxFileSize = iMaxFileSize;
iDownloadContextData->DownloadHTTPData()->iProxyName = iDownloadProxy;
iDownloadContextData->DownloadHTTPData()->iProxyPort = iDownloadProxyPort;
iDownloadContextData->DownloadHTTPData()->iPlaybackControl = PVMFSourceContextDataDownloadHTTP::ENoPlayback;
iDownloadContextData->CommonData()->iUseCPMPluginRegistry = false;
iDataSource->SetDataSourceContextData(iDownloadContextData);
}
void pvplayer_async_test_3gppdlnormal_dlonly::CreateDataSinkVideo()
{
//won't be called
PVPATB_TEST_IS_TRUE(false);
}
void pvplayer_async_test_3gppdlnormal_dlonly::CreateDataSinkAudio()
{
//won't be called
PVPATB_TEST_IS_TRUE(false);
}
//
// pvplayer_async_test_3gppdlcancelduringinit section
//
void pvplayer_async_test_3gppdlcancelduringinit::StartTest()
{
AddToScheduler();
iState = STATE_CREATE;
RunIfNotReady();
}
void pvplayer_async_test_3gppdlcancelduringinit::Run()
{
int error = 0;
switch (iState)
{
case STATE_CREATE:
{
iPlayer = NULL;
OSCL_TRY(error, iPlayer = PVPlayerFactory::CreatePlayer(this, this, this));
if (error)
{
PVPATB_TEST_IS_TRUE(false);
iObserver->TestCompleted(*iTestCase);
}
else
{
iState = STATE_ADDDATASOURCE;
RunIfNotReady();
}
}
break;
case STATE_ADDDATASOURCE:
{
OSCL_HeapString<OsclMemAllocator> url(iFileName);
OSCL_HeapString<OsclMemAllocator> default_source(SOURCENAME_PREPEND_STRING);
default_source += DEFAULTSOURCEFILENAME;
if (url == default_source)
{
fprintf(file, "Setting source to %s\n", DEFAULT_CANCEL_DURING_INIT_TEST_URL);
url = DEFAULT_CANCEL_DURING_INIT_TEST_URL;
}
oscl_wchar wbuf[2];
wbuf[1] = '\0';
for (uint32 i = 0;i < url.get_size();i++)
{
wbuf[0] = (oscl_wchar)url.get_cstr()[i];
iDownloadURL += wbuf;
}
iDownloadFilename = OUTPUTNAME_PREPEND_WSTRING;
iDownloadFilename += _STRLIT_WCHAR("test_3gppdlcancelduringinit.loc");
iDownloadProxy = _STRLIT_CHAR("");
int32 iDownloadProxyPort = 0;
iConfigFileName = OUTPUTNAME_PREPEND_WSTRING;
iConfigFileName += _STRLIT_WCHAR("my3gppdlcancel.cfg");
uint32 iMaxFileSize = 0x7FFFFFFF;
bool aIsNewSession = true;
PVMFDownloadDataSourceHTTP::TPVPlaybackControl iPlaybackMode = PVMFDownloadDataSourceHTTP::EAsap;
iDownloadHttpContextData = new PVMFDownloadDataSourceHTTP(aIsNewSession,
iConfigFileName,
iDownloadFilename,
iMaxFileSize,
iDownloadProxy,
iDownloadProxyPort,
iPlaybackMode);
iDataSource = new PVPlayerDataSourceURL;
iDataSource->SetDataSourceURL(iDownloadURL);
iDataSource->SetDataSourceFormatType(PVMF_MIME_DATA_SOURCE_HTTP_URL);
iDataSource->SetDataSourceContextData(iDownloadHttpContextData);
OSCL_TRY(error, iCurrentCmdId = iPlayer->AddDataSource(*iDataSource, (OsclAny*) & iContextObject));
OSCL_FIRST_CATCH_ANY(error, PVPATB_TEST_IS_TRUE(false); iState = STATE_CLEANUPANDCOMPLETE; RunIfNotReady());
}
break;
case STATE_INIT:
{
OSCL_TRY(error, iCurrentCmdId = iPlayer->Init((OsclAny*) & iContextObject));
OSCL_FIRST_CATCH_ANY(error, PVPATB_TEST_IS_TRUE(false); iState = STATE_CLEANUPANDCOMPLETE; RunIfNotReady());
iState = STATE_CANCELALL;
//if this is commmented out. The BufferingStart(change below) could do RunIfInactiv()
//RunIfNotReady(10*1000*1000);
}
break;
case STATE_CANCELALL:
{
if (iCancelCommandExecuted)
{
fprintf(file, "\nError - Cancel command being executed multiple times, please verify ...\n");
}
fprintf(file, "\n Cancel all ...\n");
OSCL_TRY(error, iCurrentCmdId = iPlayer->CancelAllCommands((OsclAny*) & iContextObject));
iCancelCommandExecuted = true;
OSCL_FIRST_CATCH_ANY(error, PVPATB_TEST_IS_TRUE(false); iState = STATE_CLEANUPANDCOMPLETE; RunIfNotReady());
iState = STATE_WAIT_FOR_CANCELALL;
}
break;
case STATE_WAIT_FOR_CANCELALL:
{
// Cancel did not complete in time
PVPATB_TEST_IS_TRUE(false);
iState = STATE_CLEANUPANDCOMPLETE;
RunIfNotReady();
}
break;
case STATE_RESET:
{
OSCL_TRY(error, iCurrentCmdId = iPlayer->Reset((OsclAny*) & iContextObject));
OSCL_FIRST_CATCH_ANY(error, PVPATB_TEST_IS_TRUE(false); iState = STATE_CLEANUPANDCOMPLETE; RunIfNotReady());
}
break;
case STATE_REMOVEDATASOURCE:
{
OSCL_TRY(error, iCurrentCmdId = iPlayer->RemoveDataSource(*iDataSource, (OsclAny*) & iContextObject));
OSCL_FIRST_CATCH_ANY(error, PVPATB_TEST_IS_TRUE(false); iState = STATE_CLEANUPANDCOMPLETE; RunIfNotReady());
}
break;
case STATE_CLEANUPANDCOMPLETE:
{
PVPATB_TEST_IS_TRUE(PVPlayerFactory::DeletePlayer(iPlayer));
iPlayer = NULL;
delete iDataSource;
iDataSource = NULL;
delete iDownloadHttpContextData;
iDownloadHttpContextData = NULL;
iObserver->TestCompleted(*iTestCase);
}
break;
default:
break;
}
}
void pvplayer_async_test_3gppdlcancelduringinit::CommandCompleted(const PVCmdResponse& aResponse)
{
if (aResponse.GetContext() != NULL)
{
if (aResponse.GetContext() == (OsclAny*)&iContextObject)
{
if (iContextObject != iContextObjectRefValue)
{
// Context data value was corrupted
PVPATB_TEST_IS_TRUE(false);
iState = STATE_CLEANUPANDCOMPLETE;
RunIfNotReady();
return;
}
}
else
{
// Context data pointer was corrupted
PVPATB_TEST_IS_TRUE(false);
iState = STATE_CLEANUPANDCOMPLETE;
RunIfNotReady();
return;
}
}
switch (iState)
{
case STATE_ADDDATASOURCE:
if (aResponse.GetCmdStatus() == PVMFSuccess)
{
iState = STATE_INIT;
RunIfNotReady();
}
else
{
// AddDataSource failed
PVPATB_TEST_IS_TRUE(false);
iState = STATE_CLEANUPANDCOMPLETE;
RunIfNotReady();
}
break;
case STATE_CANCELALL:
if (!iCancelCommandExecuted)
{
fprintf(file, "\n Error - Cancel command not executed, Pass the test case but scenario not tested...\n");
}
if (aResponse.GetCmdStatus() == PVMFSuccess)
{
// Init should not complete
iState = STATE_RESET;
RunIfNotReady();
}
else
{
// Init failed
PVPATB_TEST_IS_TRUE(false);
iState = STATE_CLEANUPANDCOMPLETE;
RunIfNotReady();
}
break;
case STATE_WAIT_FOR_CANCELALL:
if (aResponse.GetCmdStatus() == PVMFSuccess)
{
if (aResponse.GetCmdId() != iCurrentCmdId)
{
// Init success. Ignore.
fprintf(file, "\n Init Completed ...\n");
}
else
{
fprintf(file, "\n Cancel all complete ...\n");
// Cancel succeeded so test passed
PVPATB_TEST_IS_TRUE(true);
iState = STATE_CLEANUPANDCOMPLETE;
if (IsBusy())
{
Cancel();
}
RunIfNotReady();
}
}
else if (aResponse.GetCmdStatus() == PVMFErrCancelled)
{
PVPATB_TEST_IS_TRUE(true);
// Init being cancelled. Ignore.
}
else
{
// Cancel failed
PVPATB_TEST_IS_TRUE(false);
iState = STATE_CLEANUPANDCOMPLETE;
RunIfNotReady();
}
break;
case STATE_RESET:
if (aResponse.GetCmdStatus() == PVMFSuccess)
{
iState = STATE_REMOVEDATASOURCE;
RunIfNotReady();
}
else
{
// Reset failed
PVPATB_TEST_IS_TRUE(false);
iState = STATE_CLEANUPANDCOMPLETE;
RunIfNotReady();
}
break;
case STATE_REMOVEDATASOURCE:
if (aResponse.GetCmdStatus() == PVMFSuccess)
{
iState = STATE_CLEANUPANDCOMPLETE;
RunIfNotReady();
}
else
{
// RemoveDataSource failed
PVPATB_TEST_IS_TRUE(false);
iState = STATE_CLEANUPANDCOMPLETE;
RunIfNotReady();
}
break;
default:
{
// Testing error if this is reached
PVPATB_TEST_IS_TRUE(false);
iState = STATE_CLEANUPANDCOMPLETE;
RunIfNotReady();
}
break;
}
}
void pvplayer_async_test_3gppdlcancelduringinit::HandleErrorEvent(const PVAsyncErrorEvent& aEvent)
{
switch (aEvent.GetEventType())
{
case PVMFErrResourceConfiguration:
// Just log the error
PVPATB_TEST_IS_TRUE(false);
break;
case PVMFErrResource:
// Just log the error
PVPATB_TEST_IS_TRUE(false);
break;
case PVMFErrCorrupt:
// Just log the error
PVPATB_TEST_IS_TRUE(false);
break;
case PVMFErrProcessing:
// Just log the error
PVPATB_TEST_IS_TRUE(false);
break;
default:
// Unknown error and just log the error
PVPATB_TEST_IS_TRUE(false);
break;
}
// Wait for engine to handle the error
Cancel();
}
void pvplayer_async_test_3gppdlcancelduringinit::HandleInformationalEvent(const PVAsyncInformationalEvent& aEvent)
{
if (aEvent.GetEventType() == PVMFInfoErrorHandlingStart)
{
fprintf(file, "PVMFInfoErrorHandlingStart...\n");
}
if (aEvent.GetEventType() == PVMFInfoErrorHandlingComplete)
{
fprintf(file, "PVMFInfoErrorHandlingComplete...\n");
iState = STATE_CLEANUPANDCOMPLETE;
RunIfNotReady();
}
if (iState == STATE_CANCELALL && aEvent.GetEventType() == PVMFInfoBufferingStart)
{
RunIfNotReady(10*1000);
}
switch (aEvent.GetEventType())
{
case PVMFInfoBufferingStatus:
{
int32 *percent = (int32*)aEvent.GetLocalBuffer();
if (*percent == 0 || *percent == 100)
{
fprintf(file, " PVMFInfoBufferingStatus %d\n", *percent);
}
else
{
fprintf(file, ".%d.", *percent);
}
}
break;
case PVMFInfoBufferingStart:
fprintf(file, " PVMFInfoBufferingStart\n");
break;
case PVMFInfoBufferingComplete:
fprintf(file, " PVMFInfoBufferingComplete\n");
break;
case PVMFInfoContentLength:
{
PVExclusivePtr eventData;
aEvent.GetEventData(eventData);
uint32 contentSize = (uint32)(eventData);
fprintf(file, " PVMFInfoContentLength = %d\n", contentSize);
}
break;
case PVMFInfoContentTruncated:
{
PVExclusivePtr eventData;
aEvent.GetEventData(eventData);
uint32 downloadSize = (uint32)(eventData);
fprintf(file, "\n PVMFInfoContentTruncated! downloadSize = %d\n", downloadSize);
}
break;
case PVMFInfoContentType:
{
PVExclusivePtr eventData;
aEvent.GetEventData(eventData);
char *constentType = (char *)(eventData);
fprintf(file, " PVMFInfoContentType = %s\n", constentType);
}
break;
case PVMFInfoRemoteSourceNotification:
{
//Examine the extended info message to see if this is the
//"not progressive downloadable" event. If so, notify the
//UI. They may choose to abort the download at this point.
PVMFErrorInfoMessageInterface *msg = NULL;
if (aEvent.GetEventExtensionInterface()
&& aEvent.GetEventExtensionInterface()->queryInterface(PVMFErrorInfoMessageInterfaceUUID, (PVInterface*&)msg))
{
//extract the event code and event UUID.
int32 eventcode;
PVUuid eventUuid;
msg->GetCodeUUID(eventcode, eventUuid);
if (eventUuid == PVPlayerErrorInfoEventTypesUUID)
{
PVMFErrorInfoMessageInterface* sourceNodeInfoIF =
msg->GetNextMessage();
if (sourceNodeInfoIF != NULL)
{
PVUuid infoUUID;
int32 srcInfoCode;
sourceNodeInfoIF->GetCodeUUID(srcInfoCode, infoUUID);
if (infoUUID == PVMFFileFormatEventTypesUUID
&& srcInfoCode == PVMFMP4FFParserInfoNotPseudostreamableFile)
{
fprintf(file, " PVMFInfoRemoteSourceNotification (not progressive-downloadable)\n");
}
else if (infoUUID == PVMFPROTOCOLENGINENODEInfoEventTypesUUID
&& (srcInfoCode >= PVMFPROTOCOLENGINENODEInfo_HTTPRedirectCode300 &&
srcInfoCode <= PVMFPROTOCOLENGINENODEInfo_HTTPRedirectCode307))
{
PVExclusivePtr eventData;
aEvent.GetEventData(eventData);
char *redirectUrl = (char *)(eventData);
fprintf(file, " PVMFInfoRemoteSourceNotification (HTTP Status code = %d), redirectUrl = %s\n",
srcInfoCode - PVMFPROTOCOLENGINENODEInfo_Redirect, redirectUrl);
}
}
}
}
}
break;
default:
break;
}
}
////////////////////////////////////////////////////////////////////////////////////////
//
// pvplayer_async_test_3gppdlcancelduringinitdelay section
// This test is the same as 105 above, except we delay the cancel call
// It is only made once we receive download status events thus ensuring that Init has
// been received by the parser. This method will fail for small files or high bandwidth!
void pvplayer_async_test_3gppdlcancelduringinitdelay::StartTest()
{
AddToScheduler();
iState = STATE_CREATE;
RunIfNotReady();
}
void pvplayer_async_test_3gppdlcancelduringinitdelay::Run()
{
int error = 0;
switch (iState)
{
case STATE_CREATE:
{
iPlayer = NULL;
OSCL_TRY(error, iPlayer = PVPlayerFactory::CreatePlayer(this, this, this));
if (error)
{
PVPATB_TEST_IS_TRUE(false);
iObserver->TestCompleted(*iTestCase);
}
else
{
iState = STATE_ADDDATASOURCE;
RunIfNotReady();
}
}
break;
case STATE_ADDDATASOURCE:
{
OSCL_HeapString<OsclMemAllocator> url(iFileName);
OSCL_HeapString<OsclMemAllocator> default_source(SOURCENAME_PREPEND_STRING);
default_source += DEFAULTSOURCEFILENAME;
if (url == default_source)
{
fprintf(file, "Setting source to %s\n", DEFAULT_CANCEL_DURING_INIT_DELAY_TEST_URL);
url = DEFAULT_CANCEL_DURING_INIT_DELAY_TEST_URL;
}
oscl_wchar wbuf[2];
wbuf[1] = '\0';
for (uint32 i = 0;i < url.get_size();i++)
{
wbuf[0] = (oscl_wchar)url.get_cstr()[i];
iDownloadURL += wbuf;
}
iDownloadFilename = OUTPUTNAME_PREPEND_WSTRING;
iDownloadFilename += _STRLIT_WCHAR("test_3gppdlcancelduringinit.loc");
iDownloadProxy = _STRLIT_CHAR("");
int32 iDownloadProxyPort = 0;
iConfigFileName = OUTPUTNAME_PREPEND_WSTRING;
iConfigFileName += _STRLIT_WCHAR("my3gppdlcancel.cfg");
uint32 iMaxFileSize = 0x7FFFFFFF;
bool aIsNewSession = true;
PVMFDownloadDataSourceHTTP::TPVPlaybackControl iPlaybackMode = PVMFDownloadDataSourceHTTP::EAsap;
iDownloadHttpContextData = new PVMFDownloadDataSourceHTTP(aIsNewSession,
iConfigFileName,
iDownloadFilename,
iMaxFileSize,
iDownloadProxy,
iDownloadProxyPort,
iPlaybackMode);
iDataSource = new PVPlayerDataSourceURL;
iDataSource->SetDataSourceURL(iDownloadURL);
iDataSource->SetDataSourceFormatType(PVMF_MIME_DATA_SOURCE_HTTP_URL);
iDataSource->SetDataSourceContextData(iDownloadHttpContextData);
OSCL_TRY(error, iCurrentCmdId = iPlayer->AddDataSource(*iDataSource, (OsclAny*) & iContextObject));
OSCL_FIRST_CATCH_ANY(error, PVPATB_TEST_IS_TRUE(false); iState = STATE_CLEANUPANDCOMPLETE; RunIfNotReady());
}
break;
case STATE_INIT:
{
OSCL_TRY(error, iInitCmdId = iPlayer->Init((OsclAny*) & iContextObject));
OSCL_FIRST_CATCH_ANY(error, PVPATB_TEST_IS_TRUE(false); iState = STATE_CLEANUPANDCOMPLETE; RunIfNotReady());
//change state but don't call runifinactive yet.
// wait for first Buffering Status event first because by then most nodes will
// actually have started processing Init. This will fail for short clips though
// where Init returns immediately.
iState = STATE_CANCELALL;
}
break;
case STATE_CANCELALL:
{
if (iCancelCommandExecuted)
{
fprintf(file, "\nError - Cancel command being executed multiple times, please verify ...\n");
}
fprintf(file, "\n Cancel all waiting 15 seconds to complete or cancel download ...\n");
OSCL_TRY(error, iCurrentCmdId = iPlayer->CancelAllCommands((OsclAny*) & iContextObject));
iCancelCommandExecuted = true;
OSCL_FIRST_CATCH_ANY(error, PVPATB_TEST_IS_TRUE(false); iState = STATE_CLEANUPANDCOMPLETE; RunIfNotReady());
iState = STATE_WAIT_FOR_CANCELALL;
// 15 second watchdog timer. if Init and cancelAll do not complete until then-> error
RunIfNotReady(15*1000*1000);
}
break;
case STATE_WAIT_FOR_CANCELALL:
{
// Cancel did not complete in time
PVPATB_TEST_IS_TRUE(false);
iState = STATE_CLEANUPANDCOMPLETE;
RunIfNotReady();
}
break;
case STATE_RESET:
{
OSCL_TRY(error, iCurrentCmdId = iPlayer->Reset((OsclAny*) & iContextObject));
OSCL_FIRST_CATCH_ANY(error, PVPATB_TEST_IS_TRUE(false); iState = STATE_CLEANUPANDCOMPLETE; RunIfNotReady());
}
break;
case STATE_REMOVEDATASOURCE:
{
OSCL_TRY(error, iCurrentCmdId = iPlayer->RemoveDataSource(*iDataSource, (OsclAny*) & iContextObject));
OSCL_FIRST_CATCH_ANY(error, PVPATB_TEST_IS_TRUE(false); iState = STATE_CLEANUPANDCOMPLETE; RunIfNotReady());
}
break;
case STATE_CLEANUPANDCOMPLETE:
{
PVPATB_TEST_IS_TRUE(PVPlayerFactory::DeletePlayer(iPlayer));
iPlayer = NULL;
delete iDataSource;
iDataSource = NULL;
delete iDownloadHttpContextData;
iDownloadHttpContextData = NULL;
iObserver->TestCompleted(*iTestCase);
}
break;
default:
break;
}
}
void pvplayer_async_test_3gppdlcancelduringinitdelay::CommandCompleted(const PVCmdResponse& aResponse)
{
if (aResponse.GetContext() != NULL)
{
if (aResponse.GetContext() == (OsclAny*)&iContextObject)
{
if (iContextObject != iContextObjectRefValue)
{
// Context data value was corrupted
PVPATB_TEST_IS_TRUE(false);
iState = STATE_CLEANUPANDCOMPLETE;
RunIfNotReady();
return;
}
}
else
{
// Context data pointer was corrupted
PVPATB_TEST_IS_TRUE(false);
iState = STATE_CLEANUPANDCOMPLETE;
RunIfNotReady();
return;
}
}
switch (iState)
{
case STATE_ADDDATASOURCE:
if (aResponse.GetCmdStatus() == PVMFSuccess)
{
iState = STATE_INIT;
RunIfNotReady();
}
else
{
// AddDataSource failed
PVPATB_TEST_IS_TRUE(false);
iState = STATE_CLEANUPANDCOMPLETE;
RunIfNotReady();
}
break;
case STATE_CANCELALL:
if (!iCancelCommandExecuted)
{
fprintf(file, "\n Init complete before CancelAll was issued. Test case passed but scenario not tested \n");
}
if (aResponse.GetCmdStatus() == PVMFSuccess)
{
// Init completed early, pass the test case but scenario not tested.
iState = STATE_RESET;
RunIfNotReady();
}
else
{
// Init failed
PVPATB_TEST_IS_TRUE(false);
iState = STATE_CLEANUPANDCOMPLETE;
RunIfNotReady();
}
break;
case STATE_WAIT_FOR_CANCELALL:
if (aResponse.GetCmdId() == iCurrentCmdId && // cancel command returns
iInitCmdId == -1 && // init has been completed
aResponse.GetCmdStatus() == PVMFSuccess) // cancel was successful
{
fprintf(file, "\n Cancel all complete ...\n");
// Cancel succeeded so test passed
PVPATB_TEST_IS_TRUE(true);
iState = STATE_CLEANUPANDCOMPLETE;
if (IsBusy())
{
Cancel();
}
RunIfNotReady();
}
else if (aResponse.GetCmdStatus() == PVMFErrCancelled && // init was cancelled
aResponse.GetCmdId() == iInitCmdId)
{
PVPATB_TEST_IS_TRUE(true);
// Init has been cancelled - mark as done
iInitCmdId = -1;
}
else
{
// Cancel failed
fprintf(file, "\n Previous command was not cancelled or cancel failed ...\n");
PVPATB_TEST_IS_TRUE(false);
iState = STATE_CLEANUPANDCOMPLETE;
RunIfNotReady();
}
break;
case STATE_RESET:
if (aResponse.GetCmdStatus() == PVMFSuccess)
{
iState = STATE_REMOVEDATASOURCE;
RunIfNotReady();
}
else
{
// Reset failed
PVPATB_TEST_IS_TRUE(false);
iState = STATE_CLEANUPANDCOMPLETE;
RunIfNotReady();
}
break;
case STATE_REMOVEDATASOURCE:
if (aResponse.GetCmdStatus() == PVMFSuccess)
{
iState = STATE_CLEANUPANDCOMPLETE;
RunIfNotReady();
}
else
{
// RemoveDataSource failed
PVPATB_TEST_IS_TRUE(false);
iState = STATE_CLEANUPANDCOMPLETE;
RunIfNotReady();
}
break;
default:
{
// Testing error if this is reached
PVPATB_TEST_IS_TRUE(false);
iState = STATE_CLEANUPANDCOMPLETE;
RunIfNotReady();
}
break;
}
}
void pvplayer_async_test_3gppdlcancelduringinitdelay::HandleErrorEvent(const PVAsyncErrorEvent& aEvent)
{
switch (aEvent.GetEventType())
{
case PVMFErrResourceConfiguration:
// Just log the error
PVPATB_TEST_IS_TRUE(false);
break;
case PVMFErrResource:
// Just log the error
PVPATB_TEST_IS_TRUE(false);
break;
case PVMFErrCorrupt:
// Just log the error
PVPATB_TEST_IS_TRUE(false);
break;
case PVMFErrProcessing:
// Just log the error
PVPATB_TEST_IS_TRUE(false);
break;
default:
// Unknown error and just log the error
PVPATB_TEST_IS_TRUE(false);
break;
}
// Wait for engine to handle the error
Cancel();
}
void pvplayer_async_test_3gppdlcancelduringinitdelay::HandleInformationalEvent(const PVAsyncInformationalEvent& aEvent)
{
if (aEvent.GetEventType() == PVMFInfoErrorHandlingStart)
{
fprintf(file, "PVMFInfoErrorHandlingStart...\n");
}
if (aEvent.GetEventType() == PVMFInfoErrorHandlingComplete)
{
fprintf(file, "PVMFInfoErrorHandlingComplete...\n");
iState = STATE_CLEANUPANDCOMPLETE;
RunIfNotReady();
}
switch (aEvent.GetEventType())
{
case PVMFInfoBufferingStatus:
{
int32 *percent = (int32*)aEvent.GetLocalBuffer();
if (*percent == 0 || *percent == 100)
{
fprintf(file, " PVMFInfoBufferingStatus %d\n", *percent);
}
else
{
fprintf(file, ".%d.", *percent);
}
if (iState == STATE_CANCELALL && !iCancelCommandExecuted)
{
// now is the time to call CancelAll since processing of download has started
RunIfNotReady();
}
}
break;
case PVMFInfoBufferingStart:
fprintf(file, " PVMFInfoBufferingStart\n");
break;
case PVMFInfoBufferingComplete:
fprintf(file, " PVMFInfoBufferingComplete\n");
break;
case PVMFInfoContentLength:
{
PVExclusivePtr eventData;
aEvent.GetEventData(eventData);
uint32 contentSize = (uint32)(eventData);
fprintf(file, " PVMFInfoContentLength = %d\n", contentSize);
}
break;
case PVMFInfoContentTruncated:
{
PVExclusivePtr eventData;
aEvent.GetEventData(eventData);
uint32 downloadSize = (uint32)(eventData);
fprintf(file, "\n PVMFInfoContentTruncated! downloadSize = %d\n", downloadSize);
}
break;
case PVMFInfoContentType:
{
PVExclusivePtr eventData;
aEvent.GetEventData(eventData);
char *constentType = (char *)(eventData);
fprintf(file, " PVMFInfoContentType = %s\n", constentType);
}
break;
case PVMFInfoRemoteSourceNotification:
{
//Examine the extended info message to see if this is the
//"not progressive downloadable" event. If so, notify the
//UI. They may choose to abort the download at this point.
PVMFErrorInfoMessageInterface *msg = NULL;
if (aEvent.GetEventExtensionInterface()
&& aEvent.GetEventExtensionInterface()->queryInterface(PVMFErrorInfoMessageInterfaceUUID, (PVInterface*&)msg))
{
//extract the event code and event UUID.
int32 eventcode;
PVUuid eventUuid;
msg->GetCodeUUID(eventcode, eventUuid);
if (eventUuid == PVPlayerErrorInfoEventTypesUUID)
{
PVMFErrorInfoMessageInterface* sourceNodeInfoIF =
msg->GetNextMessage();
if (sourceNodeInfoIF != NULL)
{
PVUuid infoUUID;
int32 srcInfoCode;
sourceNodeInfoIF->GetCodeUUID(srcInfoCode, infoUUID);
if (infoUUID == PVMFFileFormatEventTypesUUID
&& srcInfoCode == PVMFMP4FFParserInfoNotPseudostreamableFile)
{
fprintf(file, " PVMFInfoRemoteSourceNotification (not progressive-downloadable)\n");
}
else if (infoUUID == PVMFPROTOCOLENGINENODEInfoEventTypesUUID
&& (srcInfoCode >= PVMFPROTOCOLENGINENODEInfo_HTTPRedirectCode300 &&
srcInfoCode <= PVMFPROTOCOLENGINENODEInfo_HTTPRedirectCode307))
{
PVExclusivePtr eventData;
aEvent.GetEventData(eventData);
char *redirectUrl = (char *)(eventData);
fprintf(file, " PVMFInfoRemoteSourceNotification (HTTP Status code = %d), redirectUrl = %s\n",
srcInfoCode - PVMFPROTOCOLENGINENODEInfo_Redirect, redirectUrl);
}
}
}
}
}
break;
default:
break;
}
}
////////////////////////////////////////////////////////////////////////////////////////
//
// pvplayer_async_test_3gppdlcontenttoolarge section
//
pvplayer_async_test_3gppdlcontenttoolarge::~pvplayer_async_test_3gppdlcontenttoolarge()
{
}
void pvplayer_async_test_3gppdlcontenttoolarge::CreateDataSource()
{
OSCL_HeapString<OsclMemAllocator> url(iFileName);
OSCL_HeapString<OsclMemAllocator> default_source(SOURCENAME_PREPEND_STRING);
default_source += DEFAULTSOURCEFILENAME;
if (url == default_source)
{
fprintf(file, "Setting source to %s\n", DEFAULT_3GPPDL_URL);
url = DEFAULT_3GPPDL_URL;
}
oscl_wchar wbuf[2];
wbuf[1] = '\0';
for (uint32 i = 0;i < url.get_size();i++)
{
wbuf[0] = (oscl_wchar)url.get_cstr()[i];
iDownloadURL += wbuf;
}
iDataSource = new PVPlayerDataSourceURL;
iDataSource->SetDataSourceURL(iDownloadURL);
iDataSource->SetDataSourceFormatType(PVMF_MIME_DATA_SOURCE_HTTP_URL);
iDownloadFilename = OUTPUTNAME_PREPEND_WSTRING;
iDownloadFilename += _STRLIT_WCHAR("test_3gppcontenttoolarge.loc");
iDownloadProxy = _STRLIT_CHAR("");
int32 iDownloadProxyPort = 0;
iDownloadConfigFilename = OUTPUTNAME_PREPEND_WSTRING;
iDownloadConfigFilename += _STRLIT_WCHAR("my3gppdl_contenttoolarge.cfg");
// Set the max file size to a small number
uint32 iMaxFileSize = 0x7FFF;
fprintf(file, " Setting iMaxFileSize to %d\n", iMaxFileSize);
// Set the iContentTooLarge to TRUE. This will return success
// for INIT failure of PVMFErrContentTooLarge
iContentTooLarge = true;
bool aIsNewSession = true;
iDownloadOnly = true;
iDownloadContextData = new PVMFSourceContextData();
iDownloadContextData->EnableCommonSourceContext();
iDownloadContextData->EnableDownloadHTTPSourceContext();
iDownloadContextData->DownloadHTTPData()->bIsNewSession = aIsNewSession;
iDownloadContextData->DownloadHTTPData()->iConfigFileName = iDownloadConfigFilename;
iDownloadContextData->DownloadHTTPData()->iDownloadFileName = iDownloadFilename;
iDownloadContextData->DownloadHTTPData()->iMaxFileSize = iMaxFileSize;
iDownloadContextData->DownloadHTTPData()->iProxyName = iDownloadProxy;
iDownloadContextData->DownloadHTTPData()->iProxyPort = iDownloadProxyPort;
iDownloadContextData->DownloadHTTPData()->iPlaybackControl = PVMFSourceContextDataDownloadHTTP::ENoPlayback;
iDownloadContextData->CommonData()->iUseCPMPluginRegistry = false;
iDataSource->SetDataSourceContextData(iDownloadContextData);
}
void pvplayer_async_test_3gppdlcontenttoolarge::CreateDataSinkVideo()
{
//won't be called
PVPATB_TEST_IS_TRUE(false);
}
void pvplayer_async_test_3gppdlcontenttoolarge::CreateDataSinkAudio()
{
//won't be called
PVPATB_TEST_IS_TRUE(false);
}
//
// pvplayer_async_test_3gppdlContentTruncated section
//
pvplayer_async_test_3gppdlContentTruncated::~pvplayer_async_test_3gppdlContentTruncated()
{
}
void pvplayer_async_test_3gppdlContentTruncated::CreateDataSource()
{
OSCL_HeapString<OsclMemAllocator> url(iFileName);
OSCL_HeapString<OsclMemAllocator> default_source(SOURCENAME_PREPEND_STRING);
default_source += DEFAULTSOURCEFILENAME;
if (url == default_source)
{
fprintf(file, "Setting source to %s\n", DEFAULT_TRUNCATED_TEST_URL);
url = DEFAULT_TRUNCATED_TEST_URL;
}
oscl_wchar wbuf[2];
wbuf[1] = '\0';
for (uint32 i = 0;i < url.get_size();i++)
{
wbuf[0] = (oscl_wchar)url.get_cstr()[i];
iDownloadURL += wbuf;
}
iDataSource = new PVPlayerDataSourceURL;
iDataSource->SetDataSourceURL(iDownloadURL);
iDataSource->SetDataSourceFormatType(PVMF_MIME_DATA_SOURCE_HTTP_URL);
iDownloadFilename = OUTPUTNAME_PREPEND_WSTRING;
iDownloadFilename += _STRLIT_WCHAR("test_3gppdownload_truncated.loc");
iDownloadProxy = _STRLIT_CHAR("");
int32 iDownloadProxyPort = 0;
iDownloadConfigFilename = OUTPUTNAME_PREPEND_WSTRING;
iDownloadConfigFilename += _STRLIT_WCHAR("my3gppdl_truncated.cfg");
iContentTooLarge = false;
// Set the iMaxFileSize smaller than the downloading file
uint32 iMaxFileSize = 3000; //0x7FFFF;
bool aIsNewSession = true;
iDownloadContextData = new PVMFSourceContextData();
iDownloadContextData->EnableCommonSourceContext();
iDownloadContextData->EnableDownloadHTTPSourceContext();
iDownloadContextData->DownloadHTTPData()->bIsNewSession = aIsNewSession;
iDownloadContextData->DownloadHTTPData()->iConfigFileName = iDownloadConfigFilename;
iDownloadContextData->DownloadHTTPData()->iDownloadFileName = iDownloadFilename;
iDownloadContextData->DownloadHTTPData()->iMaxFileSize = iMaxFileSize;
iDownloadContextData->DownloadHTTPData()->iProxyName = iDownloadProxy;
iDownloadContextData->DownloadHTTPData()->iProxyPort = iDownloadProxyPort;
iDownloadContextData->DownloadHTTPData()->iPlaybackControl = PVMFSourceContextDataDownloadHTTP::EAsap;
iDownloadContextData->CommonData()->iUseCPMPluginRegistry = false;
iDataSource->SetDataSourceContextData(iDownloadContextData);
}
void pvplayer_async_test_3gppdlContentTruncated::CreateDataSinkVideo()
{
OSCL_wHeapString<OsclMemAllocator> sinkfile = OUTPUTNAME_PREPEND_WSTRING;
sinkfile += _STRLIT_WCHAR("test_player_3gppdl_truncated_video.dat");
iMIOFileOutVideo = iMioFactory->CreateVideoOutput((OsclAny*) & sinkfile, MEDIATYPE_VIDEO, iCompressedVideo);
iIONodeVideo = PVMediaOutputNodeFactory::CreateMediaOutputNode(iMIOFileOutVideo);
iDataSinkVideo = new PVPlayerDataSinkPVMFNode;
((PVPlayerDataSinkPVMFNode*)iDataSinkVideo)->SetDataSinkNode(iIONodeVideo);
}
void pvplayer_async_test_3gppdlContentTruncated::CreateDataSinkAudio()
{
OSCL_wHeapString<OsclMemAllocator> sinkfile = OUTPUTNAME_PREPEND_WSTRING;
sinkfile += _STRLIT_WCHAR("test_player_3gppdl_truncated_audio.dat");
iMIOFileOutAudio = iMioFactory->CreateAudioOutput((OsclAny*) & sinkfile, MEDIATYPE_AUDIO, iCompressedAudio);
iIONodeAudio = PVMediaOutputNodeFactory::CreateMediaOutputNode(iMIOFileOutAudio);
iDataSinkAudio = new PVPlayerDataSinkPVMFNode;
((PVPlayerDataSinkPVMFNode*)iDataSinkAudio)->SetDataSinkNode(iIONodeAudio);
}
//
//pvplayer_async_test_ppb_base section
//
void pvplayer_async_test_ppb_base::PrintMetadata()
{
for (uint32 i = 0;i < iMetadataValueList.size();i++)
{
if (!iMetadataValueList[i].key)
{
fprintf(file, " Metadata Key Missing!, value ?\n");
PVPATB_TEST_IS_TRUE(false);
}
else if (oscl_strstr(iMetadataValueList[i].key, "valtype=char*"))
{
fprintf(file, " Metadata Key '%s', value '%s'\n", iMetadataValueList[i].key, iMetadataValueList[i].value.pChar_value);
}
else if (oscl_strstr(iMetadataValueList[i].key, "valtype=wchar*"))
{
OSCL_HeapString<OsclMemAllocator> ostr;
char buf[2];
buf[1] = '\0';
for (uint32 j = 0;;j++)
{
if (iMetadataValueList[i].value.pWChar_value[j] == '\0')
break;
buf[0] = iMetadataValueList[i].value.pWChar_value[j];
ostr += buf;
}
fprintf(file, " Metadata Key '%s', value '%s'\n", iMetadataValueList[i].key, ostr.get_str());
}
else if (oscl_strstr(iMetadataValueList[i].key, "valtype=uint32"))
{
fprintf(file, " Metadata Key '%s', value %d\n", iMetadataValueList[i].key, iMetadataValueList[i].value.uint32_value);
}
else if (oscl_strstr(iMetadataValueList[i].key, "valtype=bool"))
{
fprintf(file, " Metadata Key '%s', value %d\n", iMetadataValueList[i].key, iMetadataValueList[i].value.bool_value);
}
else if (oscl_strstr(iMetadataValueList[i].key, "valtype=uint8*"))
{
fprintf(file, " Metadata Key '%s', len %d\n", iMetadataValueList[i].key, iMetadataValueList[i].length);
}
else
{
fprintf(file, " Metadata Key '%s', value ?\n", iMetadataValueList[i].key);
}
if ((oscl_strstr(iMetadataValueList[i].key, "duration")) && iSessionDuration == 0)
{
iSessionDuration = iMetadataValueList[i].value.uint32_value;
// Check the timescale. If not available, assume millisecond (1000)
const char *retTSstr;
retTSstr = oscl_strstr(iMetadataValueList[i].key, "timescale=");
uint32 retTSstrLen = 0;
uint32 tsstrlen = oscl_strlen(_STRLIT_CHAR("timescale="));
if (retTSstr != NULL)
{
retTSstrLen = oscl_strlen(retTSstr);
if (retTSstrLen > tsstrlen)
{
uint32 timescale = 0;
PV_atoi((char*)(retTSstr + tsstrlen), 'd', (retTSstrLen - tsstrlen), timescale);
if (timescale > 0 && timescale != 1000)
{
// Convert to milliseconds
MediaClockConverter mcc(timescale);
mcc.update_clock(iSessionDuration);
iSessionDuration = mcc.get_converted_ts(1000);
}
}
}
}
}
fprintf(file, "\n\n");
}
void pvplayer_async_test_ppb_base::StartTest()
{
AddToScheduler();
iState = STATE_CREATE;
RunIfNotReady();
}
void pvplayer_async_test_ppb_base::Run()
{
int error = 0;
switch (iState)
{
case STATE_CREATE:
{
iPlayer = NULL;
OSCL_TRY(error, iPlayer = PVPlayerFactory::CreatePlayer(this, this, this));
if (error)
{
PVPATB_TEST_IS_TRUE(false);
iObserver->TestCompleted(*iTestCase);
}
else
{
iState = STATE_QUERYINTERFACE;
RunIfNotReady();
}
}
break;
case STATE_QUERYINTERFACE:
{
fprintf(iTestMsgOutputFile, "***Query Interface...\n");
PVUuid capconfigifuuid = PVMI_CAPABILITY_AND_CONFIG_PVUUID;
OSCL_TRY(error, iCurrentCmdId = iPlayer->QueryInterface(capconfigifuuid, (PVInterface*&)iPlayerCapConfigIF, (OsclAny*) & iContextObject));
OSCL_FIRST_CATCH_ANY(error, PVPATB_TEST_IS_TRUE(false); iState = STATE_CLEANUPANDCOMPLETE; RunIfNotReady());
}
break;
case STATE_ADDDATASOURCE:
CreateDataSource();
OSCL_TRY(error, iCurrentCmdId = iPlayer->AddDataSource(*iDataSource, (OsclAny*) & iContextObject));
OSCL_FIRST_CATCH_ANY(error, PVPATB_TEST_IS_TRUE(false); iState = STATE_CLEANUPANDCOMPLETE; RunIfNotReady());
break;
case STATE_CONFIGPARAMS:
{
fprintf(iTestMsgOutputFile, "***Configuring Params...\n");
//set user-agent, make sure to set as "PVPLAYER VersionNumber" to satisfy Fast Track PV server for Fast Track test
iKeyStringSetAsync = _STRLIT_CHAR("x-pvmf/net/user-agent;valtype=wchar*;mode=download");
iKVPSetAsync.key = iKeyStringSetAsync.get_str();
// OSCL_wHeapString<OsclMemAllocator> userAgent(_STRLIT_WCHAR("PVPLAYER 18akljfaljfa"));
OSCL_wHeapString<OsclMemAllocator> userAgent(_STRLIT_WCHAR("PVPLAYER 18.07.00.02"));
iKVPSetAsync.value.pWChar_value = userAgent.get_str();
iErrorKVP = NULL;
OSCL_TRY(error, iPlayerCapConfigIF->setParametersSync(NULL, &iKVPSetAsync, 1, iErrorKVP));
OSCL_FIRST_CATCH_ANY(error, PVPATB_TEST_IS_TRUE(false); iState = STATE_CLEANUPANDCOMPLETE; RunIfNotReady(); return);
// set http version number
iKeyStringSetAsync = _STRLIT_CHAR("x-pvmf/net/http-version;valtype=uint32");
iKVPSetAsync.key = iKeyStringSetAsync.get_str();
iKVPSetAsync.value.uint32_value = 0;
iErrorKVP = NULL;
OSCL_TRY(error, iPlayerCapConfigIF->setParametersSync(NULL, &iKVPSetAsync, 1, iErrorKVP));
OSCL_FIRST_CATCH_ANY(error, PVPATB_TEST_IS_TRUE(false); iState = STATE_CLEANUPANDCOMPLETE; RunIfNotReady(); return);
// set http timeout
iKeyStringSetAsync = _STRLIT_CHAR("x-pvmf/net/http-timeout;valtype=uint32");
iKVPSetAsync.key = iKeyStringSetAsync.get_str();
iKVPSetAsync.value.uint32_value = 20;
iErrorKVP = NULL;
OSCL_TRY(error, iPlayerCapConfigIF->setParametersSync(NULL, &iKVPSetAsync, 1, iErrorKVP));
OSCL_FIRST_CATCH_ANY(error, PVPATB_TEST_IS_TRUE(false); iState = STATE_CLEANUPANDCOMPLETE; RunIfNotReady(); return);
// set number of redirects
iKeyStringSetAsync = _STRLIT_CHAR("x-pvmf/net/num-redirect-attempts;valtype=uint32");
iKVPSetAsync.key = iKeyStringSetAsync.get_str();
iKVPSetAsync.value.uint32_value = 4;
iErrorKVP = NULL;
OSCL_TRY(error, iPlayerCapConfigIF->setParametersSync(NULL, &iKVPSetAsync, 1, iErrorKVP));
OSCL_FIRST_CATCH_ANY(error, PVPATB_TEST_IS_TRUE(false); iState = STATE_CLEANUPANDCOMPLETE; RunIfNotReady(); return);
// set extension header
// set arbitrary extension header one by one
iKeyStringSetAsync = _STRLIT_CHAR("x-pvmf/net/protocol-extension-header;valtype=char*");
iKVPSetAsync.key = iKeyStringSetAsync.get_str();
OSCL_HeapString<OsclMemAllocator> protocolExtensionHeader(_STRLIT_CHAR("key=PVPlayerCoreEngineTest;value=Test;method=GET,HEAD"));
iKVPSetAsync.value.pChar_value = protocolExtensionHeader.get_str();
iKVPSetAsync.capacity = protocolExtensionHeader.get_size();
iErrorKVP = NULL;
OSCL_TRY(error, iPlayerCapConfigIF->setParametersSync(NULL, &iKVPSetAsync, 1, iErrorKVP));
OSCL_FIRST_CATCH_ANY(error, PVPATB_TEST_IS_TRUE(false); iState = STATE_CLEANUPANDCOMPLETE; RunIfNotReady(); return);
iKeyStringSetAsync = _STRLIT_CHAR("x-pvmf/net/protocol-extension-header;valtype=char*");
iKVPSetAsync.key = iKeyStringSetAsync.get_str();
OSCL_HeapString<OsclMemAllocator> protocolExtensionHeaderGet(_STRLIT_CHAR("key=PVPlayerCoreEngineTest;value=GetHeader;method=GET"));
iKVPSetAsync.value.pChar_value = protocolExtensionHeaderGet.get_str();
iKVPSetAsync.capacity = protocolExtensionHeaderGet.get_size();
iErrorKVP = NULL;
OSCL_TRY(error, iPlayerCapConfigIF->setParametersSync(NULL, &iKVPSetAsync, 1, iErrorKVP));
OSCL_FIRST_CATCH_ANY(error, PVPATB_TEST_IS_TRUE(false); iState = STATE_CLEANUPANDCOMPLETE; RunIfNotReady(); return);
iKeyStringSetAsync = _STRLIT_CHAR("x-pvmf/net/protocol-extension-header;valtype=char*");
iKVPSetAsync.key = iKeyStringSetAsync.get_str();
OSCL_HeapString<OsclMemAllocator> protocolExtensionHeaderHead(_STRLIT_CHAR("key=PVPlayerCoreEngineTest;value=HeadHeader;method=HEAD"));
iKVPSetAsync.value.pChar_value = protocolExtensionHeaderHead.get_str();
iKVPSetAsync.capacity = protocolExtensionHeaderHead.get_size();
iErrorKVP = NULL;
OSCL_TRY(error, iPlayerCapConfigIF->setParametersSync(NULL, &iKVPSetAsync, 1, iErrorKVP));
OSCL_FIRST_CATCH_ANY(error, PVPATB_TEST_IS_TRUE(false); iState = STATE_CLEANUPANDCOMPLETE; RunIfNotReady(); return);
// Unnecessary Header should not display
iKeyStringSetAsync = _STRLIT_CHAR("x-pvmf/net/protocol-extension-header;valtype=char*");
iKVPSetAsync.key = iKeyStringSetAsync.get_str();
OSCL_HeapString<OsclMemAllocator> protocolExtensionHeaderPost(_STRLIT_CHAR("key=PVPlayerCoreEngineTest;value=PostHeader;method=POST"));
iKVPSetAsync.value.pChar_value = protocolExtensionHeaderPost.get_str();
iKVPSetAsync.capacity = protocolExtensionHeaderPost.get_size();
iErrorKVP = NULL;
OSCL_TRY(error, iPlayerCapConfigIF->setParametersSync(NULL, &iKVPSetAsync, 1, iErrorKVP));
OSCL_FIRST_CATCH_ANY(error, PVPATB_TEST_IS_TRUE(false); iState = STATE_CLEANUPANDCOMPLETE; RunIfNotReady(); return);
// set extension header
// set arbitrary extension headers all together
PvmiKvp kvpheader[3];
//OSCL_StackString<128> paramkey(_STRLIT_CHAR("x-pvmf/net/protocol-extension-header;valtype=char*;mode=download"));
OSCL_StackString<128> paramkey(_STRLIT_CHAR("x-pvmf/net/protocol-extension-header;valtype=char*;mode=download;purge-on-redirect"));
//OSCL_StackString<128> paramkey(_STRLIT_CHAR("x-pvmf/net/protocol-extension-header;valtype=char*;purge-on-redirect"));
//OSCL_StackString<128> paramkey(_STRLIT_CHAR("x-pvmf/net/protocol-extension-header;valtype=char*"));
//OSCL_StackString<128> paramkey(_STRLIT_CHAR("x-pvmf/net/protocol-extension-header;valtype=char*;mode=streaming"));
kvpheader[0].key = paramkey.get_str();
OSCL_HeapString<OsclMemAllocator> protocolExtensionHeader1(_STRLIT_CHAR("key=X1;value=Y1;method=GET,HEAD"));
kvpheader[0].value.pChar_value = protocolExtensionHeader1.get_str();
kvpheader[0].capacity = protocolExtensionHeader1.get_size();
kvpheader[1].key = paramkey.get_str();
OSCL_HeapString<OsclMemAllocator> protocolExtensionHeaderGet1(_STRLIT_CHAR("key=X2;value=Y2;method=GET"));
kvpheader[1].value.pChar_value = protocolExtensionHeaderGet1.get_str();
kvpheader[1].capacity = protocolExtensionHeaderGet1.get_size();
kvpheader[2].key = paramkey.get_str();
OSCL_HeapString<OsclMemAllocator> protocolExtensionHeaderHead1(_STRLIT_CHAR("key=X3;value=Y3;method=HEAD"));
kvpheader[2].value.pChar_value = protocolExtensionHeaderHead1.get_str();
kvpheader[2].capacity = protocolExtensionHeaderHead1.get_size();
OSCL_TRY(error, iPlayerCapConfigIF->setParametersSync(NULL, kvpheader, 3, iErrorKVP));
OSCL_FIRST_CATCH_ANY(error, PVPATB_TEST_IS_TRUE(false); iState = STATE_CLEANUPANDCOMPLETE; RunIfNotReady(); return);
// enable or disable HEAD request
iKeyStringSetAsync = _STRLIT_CHAR("x-pvmf/net/http-header-request-disabled;valtype=bool");
iKVPSetAsync.key = iKeyStringSetAsync.get_str();
iKVPSetAsync.value.bool_value = true;
iErrorKVP = NULL;
OSCL_TRY(error, iPlayerCapConfigIF->setParametersSync(NULL, &iKVPSetAsync, 1, iErrorKVP));
OSCL_FIRST_CATCH_ANY(error, PVPATB_TEST_IS_TRUE(false); iState = STATE_CLEANUPANDCOMPLETE; RunIfNotReady(); return);
iKeyStringSetAsync = _STRLIT_CHAR("x-pvmf/net/max-tcp-recv-buffer-size-download;valtype=uint32");
iKVPSetAsync.key = iKeyStringSetAsync.get_str();
iKVPSetAsync.value.uint32_value = 64000;
iErrorKVP = NULL;
OSCL_TRY(error, iPlayerCapConfigIF->setParametersSync(NULL, &iKVPSetAsync, 1, iErrorKVP));
OSCL_FIRST_CATCH_ANY(error, PVPATB_TEST_IS_TRUE(false); iState = STATE_CLEANUPANDCOMPLETE; RunIfNotReady(); return);
/////////////////////////////////////////////////////////
iKeyStringSetAsync = _STRLIT_CHAR("x-pvmf/net/protocol-extension-header;valtype=char*;purge-on-redirect");
iKVPSetAsync.key = iKeyStringSetAsync.get_str();
OSCL_HeapString<OsclMemAllocator> protocolExtensionHeaderCookie(_STRLIT_CHAR("key=Cookie; value=key1=value1; key2=value2"));
iKVPSetAsync.value.pChar_value = protocolExtensionHeaderCookie.get_str();
iKVPSetAsync.capacity = protocolExtensionHeaderCookie.get_size();
iErrorKVP = NULL;
OSCL_TRY(error, iPlayerCapConfigIF->setParametersSync(NULL, &iKVPSetAsync, 1, iErrorKVP));
OSCL_FIRST_CATCH_ANY(error, PVPATB_TEST_IS_TRUE(false); iState = STATE_CLEANUPANDCOMPLETE; RunIfNotReady(); return);
/////////////////////////////////////////////////////////
iState = STATE_INIT;
RunIfNotReady();
}
break;
case STATE_INIT:
{
OSCL_TRY(error, iCurrentCmdId = iPlayer->Init((OsclAny*) & iContextObject));
OSCL_FIRST_CATCH_ANY(error, PVPATB_TEST_IS_TRUE(false); iState = STATE_CLEANUPANDCOMPLETE; RunIfNotReady());
}
break;
case STATE_WAIT_FOR_BUFFCOMPLETE:
if (iNumBufferingComplete > 0)
{
if (iRepositionAfterDownloadComplete == false)
{
//playback cases play 10 more seconds then stop.
iState = STATE_STOP;
if (iPlayUntilEOS == false)
{
RunIfNotReady(10*1000*1000);
}
else
{
//wait for EOS
}
}
else
{
iState = STATE_SETPLAYBACKRANGE;
RunIfNotReady();
}
}
else
{
//timed out while waiting.
PVPATB_TEST_IS_TRUE(false);
iState = STATE_CLEANUPANDCOMPLETE;
RunIfNotReady();
}
break;
case STATE_ADDDATASINK_VIDEO:
{
CreateDataSinkVideo();
OSCL_TRY(error, iCurrentCmdId = iPlayer->AddDataSink(*iDataSinkVideo, (OsclAny*) & iContextObject));
OSCL_FIRST_CATCH_ANY(error, PVPATB_TEST_IS_TRUE(false); iState = STATE_CLEANUPANDCOMPLETE; RunIfNotReady());
}
break;
case STATE_ADDDATASINK_AUDIO:
{
CreateDataSinkAudio();
OSCL_TRY(error, iCurrentCmdId = iPlayer->AddDataSink(*iDataSinkAudio, (OsclAny*) & iContextObject));
OSCL_FIRST_CATCH_ANY(error, PVPATB_TEST_IS_TRUE(false); iState = STATE_CLEANUPANDCOMPLETE; RunIfNotReady());
}
break;
case STATE_PREPARE:
case STATE_PREPARE_AFTERSTOP:
{
OSCL_TRY(error, iCurrentCmdId = iPlayer->Prepare((OsclAny*) & iContextObject));
OSCL_FIRST_CATCH_ANY(error, PVPATB_TEST_IS_TRUE(false); iState = STATE_CLEANUPANDCOMPLETE; RunIfNotReady());
}
break;
case STATE_GETMETADATAKEYLIST:
{
iMetadataKeyList.clear();
OSCL_TRY(error, iCurrentCmdId = iPlayer->GetMetadataKeys(iMetadataKeyList, 0, 100, NULL, (OsclAny*) & iContextObject));
OSCL_FIRST_CATCH_ANY(error, PVPATB_TEST_IS_TRUE(false); iState = STATE_CLEANUPANDCOMPLETE; RunIfNotReady());
}
break;
case STATE_GETMETADATAVALUELIST:
{
iMetadataValueList.clear();
iNumValues = 0;
OSCL_TRY(error, iCurrentCmdId = iPlayer->GetMetadataValues(iMetadataKeyList, 0, 100, iNumValues, iMetadataValueList, (OsclAny*) & iContextObject));
OSCL_FIRST_CATCH_ANY(error, PVPATB_TEST_IS_TRUE(false); iState = STATE_CLEANUPANDCOMPLETE; RunIfNotReady());
}
break;
case STATE_WAIT_FOR_DATAREADY:
{
if (iNumDataReady > 0)
{
//playback cases wait on data ready, then start engine.
iState = STATE_START;
RunIfNotReady();
}
else
{
//timed out while waiting.
PVPATB_TEST_IS_TRUE(false);
iState = STATE_CLEANUPANDCOMPLETE;
RunIfNotReady();
}
}
break;
case STATE_START:
case STATE_START_AFTERSTOP:
{
OSCL_TRY(error, iCurrentCmdId = iPlayer->Start((OsclAny*) & iContextObject));
OSCL_FIRST_CATCH_ANY(error, PVPATB_TEST_IS_TRUE(false); iState = STATE_CLEANUPANDCOMPLETE; RunIfNotReady());
}
break;
case STATE_SETPLAYBACKRANGE:
{
if (iSessionDuration > 0)
{
fprintf(iTestMsgOutputFile, "***Repositioning to %d ms\n", (iSessionDuration / 4));
PVPPlaybackPosition start, end;
start.iIndeterminate = false;
start.iPosUnit = PVPPBPOSUNIT_MILLISEC;
start.iMode = PVPPBPOS_MODE_NOW;
start.iPosValue.millisec_value = iSessionDuration / 4;
end.iIndeterminate = true;
OSCL_TRY(error, iCurrentCmdId = iPlayer->SetPlaybackRange(start, end, false, (OsclAny*) & iContextObject));
OSCL_FIRST_CATCH_ANY(error, PVPATB_TEST_IS_TRUE(false); iState = STATE_CLEANUPANDCOMPLETE; RunIfNotReady());
}
else
{
fprintf(iTestMsgOutputFile, "***Set PlayBack Range Not Supported for a session with unknown duration...\n");
}
}
break;
case STATE_SETPLAYBACKRANGE_AFTERSTART:
{
// default clip duration is ~206000ms
// seek to almost the end of duration (forward)
// so to trigger a download complete condition
PVPPlaybackPosition start, end;
start.iIndeterminate = false;
start.iPosUnit = PVPPBPOSUNIT_MILLISEC;
start.iMode = PVPPBPOS_MODE_NOW;
if (iForwardStep)
{
fprintf(iTestMsgOutputFile, "\n***Repositioning to %d ms\n", iForwardSeekTime);
start.iPosValue.millisec_value = iForwardSeekTime;
if (iForwardSeekTime < iEndTime)
{
iForwardSeekTime += iForwardSeekStep;
}
else
{
iForwardSeekTime = iBeginTime;
}
}
else
{
fprintf(iTestMsgOutputFile, "\n***Repositioning to %d ms\n", 180000);
start.iPosValue.millisec_value = 180000;
}
end.iIndeterminate = true;
OSCL_TRY(error, iCurrentCmdId = iPlayer->SetPlaybackRange(start, end, false, (OsclAny*) & iContextObject));
OSCL_FIRST_CATCH_ANY(error, PVPATB_TEST_IS_TRUE(false); iState = STATE_CLEANUPANDCOMPLETE; RunIfNotReady());
}
break;
case STATE_SETPLAYBACKRANGE_BEFORESTART:
{
// default clip duration is ~206000ms
// seek to 3/4 of duration
fprintf(iTestMsgOutputFile, "\n***Repositioning to %d ms\n", 120000);
PVPPlaybackPosition start, end;
start.iIndeterminate = false;
start.iPosUnit = PVPPBPOSUNIT_MILLISEC;
start.iMode = PVPPBPOS_MODE_NOW;
start.iPosValue.millisec_value = 120000;
end.iIndeterminate = true;
OSCL_TRY(error, iCurrentCmdId = iPlayer->SetPlaybackRange(start, end, false, (OsclAny*) & iContextObject));
OSCL_FIRST_CATCH_ANY(error, PVPATB_TEST_IS_TRUE(false); iState = STATE_CLEANUPANDCOMPLETE; RunIfNotReady());
}
break;
case STATE_SETPLAYBACKRANGE_AFTERSTART_TWICE:
{
// default clip duration is ~206000ms
// seek to 1/2 duration (backward)
PVPPlaybackPosition start, end;
start.iIndeterminate = false;
start.iPosUnit = PVPPBPOSUNIT_MILLISEC;
start.iMode = PVPPBPOS_MODE_NOW;
if (iForwardStep)
{
fprintf(iTestMsgOutputFile, "\n***Repositioning to %d ms\n", iForwardSeekTime);
start.iPosValue.millisec_value = iForwardSeekTime;
if (iForwardSeekTime < iEndTime)
{
iForwardSeekTime += iForwardSeekStep;
}
else
{
iForwardSeekTime = iBeginTime;
}
}
else
{
fprintf(iTestMsgOutputFile, "\n***Repositioning to %d ms\n", 100000);
start.iPosValue.millisec_value = 100000;
}
end.iIndeterminate = true;
OSCL_TRY(error, iCurrentCmdId = iPlayer->SetPlaybackRange(start, end, false, (OsclAny*) & iContextObject));
OSCL_FIRST_CATCH_ANY(error, PVPATB_TEST_IS_TRUE(false); iState = STATE_CLEANUPANDCOMPLETE; RunIfNotReady());
}
break;
case STATE_SETPLAYBACKRANGE_AFTERDOWNLOADCOMPLETE:
{
PVPPlaybackPosition start, end, current;
start.iIndeterminate = false;
start.iPosUnit = PVPPBPOSUNIT_MILLISEC;
start.iMode = PVPPBPOS_MODE_NOW;
end.iIndeterminate = true;
if (iSeekToBOC)
{
// download has completed, rewind back to 0 sec
fprintf(iTestMsgOutputFile, "\n***Repositioning to 0 ms\n");
start.iPosValue.millisec_value = 0;
}
else if (iSeekInCache)
{
current.iPosUnit = PVPPBPOSUNIT_MILLISEC;
iPlayer->GetCurrentPositionSync(current);
// download has completed, seek to a position in cache (the rest of the clip should be there)
fprintf(iTestMsgOutputFile, "\n***Repositioning to %d ms", current.iPosValue.millisec_value + 5000);
start.iPosValue.millisec_value = current.iPosValue.millisec_value + 5000;
}
OSCL_TRY(error, iCurrentCmdId = iPlayer->SetPlaybackRange(start, end, false, (OsclAny*) & iContextObject));
OSCL_FIRST_CATCH_ANY(error, PVPATB_TEST_IS_TRUE(false); iState = STATE_CLEANUPANDCOMPLETE; RunIfNotReady());
}
break;
case STATE_PAUSE:
case STATE_PAUSE_TWICE:
case STATE_PAUSE_AFTERDOWNLOADCOMPLETE:
{
OSCL_TRY(error, iCurrentCmdId = iPlayer->Pause((OsclAny*) & iContextObject));
OSCL_FIRST_CATCH_ANY(error, PVPATB_TEST_IS_TRUE(false); iState = STATE_CLEANUPANDCOMPLETE; RunIfNotReady());
}
break;
case STATE_RESUME:
case STATE_RESUME_TWICE:
case STATE_RESUME_AFTERDOWNLOADCOMPLETE:
{
OSCL_TRY(error, iCurrentCmdId = iPlayer->Resume((OsclAny*) & iContextObject));
OSCL_FIRST_CATCH_ANY(error, PVPATB_TEST_IS_TRUE(false); iState = STATE_CLEANUPANDCOMPLETE; RunIfNotReady());
}
break;
case STATE_STOP:
case STATE_STOP_TWICE:
{
if (iState == STATE_STOP)
{
if (iSessionDuration == 0)
fprintf(file, " DURATION Not Received\n");
else
fprintf(file, " GOT Duration %d \n\n", iSessionDuration);
}
OSCL_TRY(error, iCurrentCmdId = iPlayer->Stop((OsclAny*) & iContextObject));
OSCL_FIRST_CATCH_ANY(error, PVPATB_TEST_IS_TRUE(false); iState = STATE_CLEANUPANDCOMPLETE; RunIfNotReady());
}
break;
case STATE_REMOVEDATASINK_VIDEO:
{
OSCL_TRY(error, iCurrentCmdId = iPlayer->RemoveDataSink(*iDataSinkVideo, (OsclAny*) & iContextObject));
OSCL_FIRST_CATCH_ANY(error, PVPATB_TEST_IS_TRUE(false); iState = STATE_CLEANUPANDCOMPLETE; RunIfNotReady());
}
break;
case STATE_REMOVEDATASINK_AUDIO:
{
OSCL_TRY(error, iCurrentCmdId = iPlayer->RemoveDataSink(*iDataSinkAudio, (OsclAny*) & iContextObject));
OSCL_FIRST_CATCH_ANY(error, PVPATB_TEST_IS_TRUE(false); iState = STATE_CLEANUPANDCOMPLETE; RunIfNotReady());
}
break;
case STATE_RESET:
{
OSCL_TRY(error, iCurrentCmdId = iPlayer->Reset((OsclAny*) & iContextObject));
OSCL_FIRST_CATCH_ANY(error, PVPATB_TEST_IS_TRUE(false); iState = STATE_CLEANUPANDCOMPLETE; RunIfNotReady());
}
break;
case STATE_REMOVEDATASOURCE:
{
OSCL_TRY(error, iCurrentCmdId = iPlayer->RemoveDataSource(*iDataSource, (OsclAny*) & iContextObject));
OSCL_FIRST_CATCH_ANY(error, PVPATB_TEST_IS_TRUE(false); iState = STATE_CLEANUPANDCOMPLETE; RunIfNotReady());
}
break;
case STATE_CLEANUPANDCOMPLETE:
{
fprintf(file, "Events:\n");
fprintf(file, " Num BuffStart %d\n", iNumBufferingStart);
fprintf(file, " Num BuffComplete %d\n", iNumBufferingComplete);
fprintf(file, " Num Data Ready %d\n", iNumDataReady);
fprintf(file, " Num Underflow %d\n", iNumUnderflow);
PVPATB_TEST_IS_TRUE(PVPlayerFactory::DeletePlayer(iPlayer));
iPlayer = NULL;
delete iDataSource;
iDataSource = NULL;
delete iDownloadContextData;
iDownloadContextData = NULL;
delete iDataSinkVideo;
iDataSinkVideo = NULL;
delete iDataSinkAudio;
iDataSinkAudio = NULL;
PVMediaOutputNodeFactory::DeleteMediaOutputNode(iIONodeVideo);
iIONodeVideo = NULL;
PVMediaOutputNodeFactory::DeleteMediaOutputNode(iIONodeAudio);
iIONodeAudio = NULL;
iMioFactory->DestroyVideoOutput(iMIOFileOutVideo);
iMIOFileOutVideo = NULL;
iMioFactory->DestroyAudioOutput(iMIOFileOutAudio);
iMIOFileOutAudio = NULL;
//call the test-case specific cleanup.
CleanupData();
iObserver->TestCompleted(*iTestCase);
}
break;
default:
break;
}
}
void pvplayer_async_test_ppb_base::CommandCompleted(const PVCmdResponse& aResponse)
{
if (aResponse.GetCmdId() != iCurrentCmdId)
{
// Wrong command ID.
PVPATB_TEST_IS_TRUE(false);
iState = STATE_CLEANUPANDCOMPLETE;
RunIfNotReady();
return;
}
if (aResponse.GetContext() != NULL)
{
if (aResponse.GetContext() == (OsclAny*)&iContextObject)
{
if (iContextObject != iContextObjectRefValue)
{
// Context data value was corrupted
PVPATB_TEST_IS_TRUE(false);
iState = STATE_CLEANUPANDCOMPLETE;
RunIfNotReady();
return;
}
}
else
{
// Context data pointer was corrupted
PVPATB_TEST_IS_TRUE(false);
iState = STATE_CLEANUPANDCOMPLETE;
RunIfNotReady();
return;
}
}
//#if(RUN_CPMJANUS_TESTCASES)
#if 0
if (aResponse.GetCmdStatus() != PVMFSuccess)
{
PrintJanusError(aResponse);
}
#endif
switch (iState)
{
case STATE_QUERYINTERFACE:
if (aResponse.GetCmdStatus() == PVMFSuccess)
{
iState = STATE_ADDDATASOURCE;
RunIfNotReady();
}
else
{
// QueryInterface failed
PVPATB_TEST_IS_TRUE(false);
iState = STATE_CLEANUPANDCOMPLETE;
RunIfNotReady();
}
break;
case STATE_ADDDATASOURCE:
if (aResponse.GetCmdStatus() == PVMFSuccess)
{
iState = STATE_CONFIGPARAMS;
RunIfNotReady();
}
else
{
// AddDataSource failed
PVPATB_TEST_IS_TRUE(false);
iState = STATE_CLEANUPANDCOMPLETE;
RunIfNotReady();
}
break;
case STATE_CONFIGPARAMS:
iState = STATE_INIT;
RunIfNotReady();
break;
case STATE_INIT:
if (aResponse.GetCmdStatus() == PVMFSuccess)
{
//normal playback case, continue to add data sinks.
iState = STATE_ADDDATASINK_VIDEO;
RunIfNotReady();
}
else
{
if ((iContentTooLarge) &&
(aResponse.GetCmdStatus() == PVMFErrContentTooLarge))
{
// Test success in this case
fprintf(file, " INIT returned PVMFErrContentTooLarge\n");
PVPATB_TEST_IS_TRUE(true);
iState = STATE_REMOVEDATASOURCE;
RunIfNotReady();
}
else
{
// Init failed
PVPATB_TEST_IS_TRUE(false);
iState = STATE_CLEANUPANDCOMPLETE;
RunIfNotReady();
}
}
break;
case STATE_ADDDATASINK_VIDEO:
if (aResponse.GetCmdStatus() == PVMFSuccess)
{
iState = STATE_ADDDATASINK_AUDIO;
RunIfNotReady();
}
else
{
// AddDataSink failed
PVPATB_TEST_IS_TRUE(false);
iState = STATE_CLEANUPANDCOMPLETE;
RunIfNotReady();
}
break;
case STATE_ADDDATASINK_AUDIO:
if (aResponse.GetCmdStatus() == PVMFSuccess)
{
if (iSeekBeforeStart)
{
iState = STATE_SETPLAYBACKRANGE_BEFORESTART;
}
else
{
iState = STATE_PREPARE;
}
RunIfNotReady();
}
else
{
// AddDataSink failed
PVPATB_TEST_IS_TRUE(false);
iState = STATE_CLEANUPANDCOMPLETE;
RunIfNotReady();
}
break;
case STATE_SETPLAYBACKRANGE_BEFORESTART:
if (aResponse.GetCmdStatus() == PVMFSuccess)
{
iState = STATE_PREPARE;
RunIfNotReady();
}
else
{
PVPATB_TEST_IS_TRUE(false);
iState = STATE_CLEANUPANDCOMPLETE;
RunIfNotReady();
}
break;
case STATE_PREPARE:
if (aResponse.GetCmdStatus() == PVMFSuccess)
{
iState = STATE_GETMETADATAKEYLIST;
RunIfNotReady();
}
else
{
// Prepare failed
PVPATB_TEST_IS_TRUE(false);
iState = STATE_CLEANUPANDCOMPLETE;
RunIfNotReady();
}
break;
case STATE_PREPARE_AFTERSTOP:
if (aResponse.GetCmdStatus() == PVMFSuccess)
{
iState = STATE_START_AFTERSTOP;
RunIfNotReady();
}
else
{
// Prepare failed
PVPATB_TEST_IS_TRUE(false);
iState = STATE_CLEANUPANDCOMPLETE;
RunIfNotReady();
}
break;
case STATE_WAIT_FOR_DATAREADY:
case STATE_WAIT_FOR_BUFFCOMPLETE:
//shouldn't get here-- there are no engine commands active in this state.
PVPATB_TEST_IS_TRUE(false);
break;
case STATE_GETMETADATAKEYLIST:
if (aResponse.GetCmdStatus() == PVMFSuccess || aResponse.GetCmdStatus() == PVMFErrArgument)
{
iState = STATE_GETMETADATAVALUELIST;
RunIfNotReady();
}
else
{
// GetMetadataKeys failed
PVPATB_TEST_IS_TRUE(false);
iState = STATE_CLEANUPANDCOMPLETE;
RunIfNotReady();
}
break;
case STATE_GETMETADATAVALUELIST:
if (aResponse.GetCmdStatus() == PVMFSuccess || aResponse.GetCmdStatus() == PVMFErrArgument)
{
//Display the resulting metadata.
PrintMetadata();
//wait for data ready, unless we already got it.
if (iNumDataReady > 0)
{
iState = STATE_START;
RunIfNotReady();
}
else
{
iState = STATE_WAIT_FOR_DATAREADY;
if (iPlayUntilEOS == false)
{
//5 minute error timeout
RunIfNotReady(5*60*1000*1000);
}
}
}
else
{
// GetMetadataValue failed
PVPATB_TEST_IS_TRUE(false);
iState = STATE_CLEANUPANDCOMPLETE;
RunIfNotReady();
}
break;
case STATE_START:
if (aResponse.GetCmdStatus() == PVMFSuccess)
{
if (iNumDataReady)
{
if (iLongPauseResume || iShortPauseResume)
{
iState = STATE_PAUSE;
//just play for 20 seconds then stop
RunIfNotReady(20*1000*1000);
}
else if (iSeekAfterDownloadComplete && 0 == iNumBufferingComplete)
{
iState = STATE_PAUSE_AFTERDOWNLOADCOMPLETE;
}
else if (!iPlayUntilEOS)
{
iState = STATE_STOP;
//just play for 20 seconds then stop
RunIfNotReady(20*1000*1000);
}
else
{
// wait for EOS
iState = STATE_STOP;
}
}
else
{
//wait for data ready, then we'll play 20 seconds more,
//or until EOS.
iState = STATE_WAIT_FOR_DATAREADY;
if (iPlayUntilEOS == false)
{
//5 minute error timeout.
RunIfNotReady(5*60*1000*1000);
}
else
{
// wait for EOS
}
}
}
else
{
// Start failed
PVPATB_TEST_IS_TRUE(false);
iState = STATE_CLEANUPANDCOMPLETE;
RunIfNotReady();
}
break;
case STATE_START_AFTERSTOP:
if (aResponse.GetCmdStatus() == PVMFSuccess)
{
if (iNumDataReady)
{
if (iEOSStopPlay)
{
iState = STATE_STOP_TWICE;
RunIfNotReady(3*1000*1000); // Play for 3 seconds
}
}
}
else
{
// Start failed
PVPATB_TEST_IS_TRUE(false);
iState = STATE_CLEANUPANDCOMPLETE;
RunIfNotReady();
}
break;
case STATE_SETPLAYBACKRANGE:
if (aResponse.GetCmdStatus() == PVMFSuccess)
{
fprintf(iTestMsgOutputFile, "***Repositioning Success...\n");
//just play for 10 seconds then stop
iState = STATE_STOP;
RunIfNotReady(10*1000*1000);
}
else
{
fprintf(iTestMsgOutputFile, "***Repositioning Failed...\n");
// Repos failed
PVPATB_TEST_IS_TRUE(false);
iState = STATE_CLEANUPANDCOMPLETE;
RunIfNotReady();
}
break;
case STATE_PAUSE:
if (aResponse.GetCmdStatus() == PVMFSuccess)
{
if (iSeekAfterStart)
{
iState = STATE_SETPLAYBACKRANGE_AFTERSTART;
RunIfNotReady();
}
else
{
iState = STATE_RESUME;
if (iShortPauseResume)
{
// wait for 20 second
// and resume
RunIfNotReady(20*1000*1000);
}
else if (iLongPauseResume)
{
// wait for 90 seconds
// and resume
RunIfNotReady(90*1000*1000);
}
}
}
else
{
PVPATB_TEST_IS_TRUE(false);
iState = STATE_CLEANUPANDCOMPLETE;
RunIfNotReady();
}
break;
case STATE_PAUSE_AFTERDOWNLOADCOMPLETE:
if (aResponse.GetCmdStatus() == PVMFSuccess)
{
iState = STATE_SETPLAYBACKRANGE_AFTERDOWNLOADCOMPLETE;
RunIfNotReady();
}
else
{
PVPATB_TEST_IS_TRUE(false);
iState = STATE_CLEANUPANDCOMPLETE;
RunIfNotReady();
}
break;
case STATE_SETPLAYBACKRANGE_AFTERSTART:
case STATE_SETPLAYBACKRANGE_AFTERDOWNLOADCOMPLETE:
if (aResponse.GetCmdStatus() == PVMFSuccess)
{
iState = STATE_RESUME;
RunIfNotReady();
}
else
{
PVPATB_TEST_IS_TRUE(false);
iState = STATE_CLEANUPANDCOMPLETE;
RunIfNotReady();
}
break;
case STATE_RESUME:
if (aResponse.GetCmdStatus() == PVMFSuccess)
{
if (((iLoop > 0) || iTwice) && (iLongPauseResume || iShortPauseResume))
{
iState = STATE_PAUSE_TWICE;
if (iStepInterval != 0)
{
RunIfNotReady(iStepInterval * 1000);
}
else
{
// play for 20 more sec
RunIfNotReady(20*1000*1000);
}
}
else
{
iState = STATE_STOP;
if (iPlayUntilEOS)
{
// play until EOS
;
}
else
{
// play for another 20 seconds and stop
RunIfNotReady(20*1000*1000);
}
}
}
else
{
PVPATB_TEST_IS_TRUE(false);
iState = STATE_CLEANUPANDCOMPLETE;
RunIfNotReady();
}
break;
case STATE_PAUSE_TWICE:
if (aResponse.GetCmdStatus() == PVMFSuccess)
{
if (iSeekAfterStart)
{
iState = STATE_SETPLAYBACKRANGE_AFTERSTART_TWICE;
RunIfNotReady();
}
else
{
iState = STATE_RESUME_TWICE;
if (iShortPauseResume)
{
// wait for 20 second
// and resume
RunIfNotReady(20*1000*1000);
}
else if (iLongPauseResume)
{
// wait for 90 seconds
// and resume
RunIfNotReady(90*1000*1000);
}
}
}
else
{
PVPATB_TEST_IS_TRUE(false);
iState = STATE_CLEANUPANDCOMPLETE;
RunIfNotReady();
}
break;
case STATE_SETPLAYBACKRANGE_AFTERSTART_TWICE:
if (aResponse.GetCmdStatus() == PVMFSuccess)
{
iState = STATE_RESUME_TWICE;
RunIfNotReady();
}
else
{
PVPATB_TEST_IS_TRUE(false);
iState = STATE_CLEANUPANDCOMPLETE;
RunIfNotReady();
}
break;
case STATE_RESUME_TWICE:
if (aResponse.GetCmdStatus() == PVMFSuccess)
{
fprintf(file, "\n End of Loop %d\n", iLoopReq - iLoop);
if (--iLoop > 0)
{
iState = STATE_PAUSE;
if (iStepInterval != 0)
{
RunIfNotReady(iStepInterval * 1000);
}
else
{
RunIfNotReady(20*1000*1000);
}
}
else
{
iState = STATE_STOP;
if (iPlayUntilEOS)
{
// play until EOS
;
}
else
{
// play for another 20 seconds and stop
RunIfNotReady(20*1000*1000);
}
}
}
else
{
PVPATB_TEST_IS_TRUE(false);
iState = STATE_CLEANUPANDCOMPLETE;
RunIfNotReady();
}
break;
case STATE_STOP:
if (aResponse.GetCmdStatus() == PVMFSuccess)
{
if (iEOSStopPlay)
iState = STATE_PREPARE_AFTERSTOP;
else
iState = STATE_REMOVEDATASINK_VIDEO;
RunIfNotReady();
}
else
{
PVPATB_TEST_IS_TRUE(false);
iState = STATE_CLEANUPANDCOMPLETE;
RunIfNotReady();
}
break;
case STATE_STOP_TWICE:
if (aResponse.GetCmdStatus() == PVMFSuccess)
{
iState = STATE_REMOVEDATASINK_VIDEO;
RunIfNotReady();
}
else
{
PVPATB_TEST_IS_TRUE(false);
iState = STATE_CLEANUPANDCOMPLETE;
RunIfNotReady();
}
break;
case STATE_REMOVEDATASINK_VIDEO:
if (aResponse.GetCmdStatus() == PVMFSuccess)
{
iState = STATE_REMOVEDATASINK_AUDIO;
RunIfNotReady();
}
else
{
// RemoveDataSink failed
PVPATB_TEST_IS_TRUE(false);
iState = STATE_CLEANUPANDCOMPLETE;
RunIfNotReady();
}
break;
case STATE_REMOVEDATASINK_AUDIO:
if (aResponse.GetCmdStatus() == PVMFSuccess)
{
iState = STATE_RESET;
RunIfNotReady();
}
else
{
// RemoveDataSink failed
PVPATB_TEST_IS_TRUE(false);
iState = STATE_CLEANUPANDCOMPLETE;
RunIfNotReady();
}
break;
case STATE_RESET:
if (aResponse.GetCmdStatus() == PVMFSuccess)
{
iState = STATE_REMOVEDATASOURCE;
RunIfNotReady();
}
else
{
// Reset failed
PVPATB_TEST_IS_TRUE(false);
iState = STATE_CLEANUPANDCOMPLETE;
RunIfNotReady();
}
break;
case STATE_REMOVEDATASOURCE:
if (aResponse.GetCmdStatus() == PVMFSuccess)
{
PVPATB_TEST_IS_TRUE(true);
iState = STATE_CLEANUPANDCOMPLETE;
RunIfNotReady();
}
else
{
// RemoveDataSource failed
PVPATB_TEST_IS_TRUE(false);
iState = STATE_CLEANUPANDCOMPLETE;
RunIfNotReady();
}
break;
default:
{
// Testing error if this is reached
PVPATB_TEST_IS_TRUE(false);
iState = STATE_CLEANUPANDCOMPLETE;
RunIfNotReady();
}
break;
}
if (aResponse.GetCmdStatus() != PVMFSuccess)
{
PVInterface* iface = (PVInterface*)(aResponse.GetEventExtensionInterface());
if (iface != NULL)
{
PVUuid infomsguuid = PVMFErrorInfoMessageInterfaceUUID;
PVMFErrorInfoMessageInterface* infomsgiface = NULL;
if (iface->queryInterface(infomsguuid, (PVInterface*&)infomsgiface) == true)
{
PVUuid engerruuid;
int32 errCodeEng;
infomsgiface->GetCodeUUID(errCodeEng, engerruuid);
if (engerruuid == PVPlayerErrorInfoEventTypesUUID)
{
PVMFErrorInfoMessageInterface* sourceNodeErrorIF =
infomsgiface->GetNextMessage();
if (sourceNodeErrorIF != NULL)
{
PVUuid eventuuid;
int32 srcErrCode;
sourceNodeErrorIF->GetCodeUUID(srcErrCode, eventuuid);
if (eventuuid == PVMFSocketNodeEventTypeUUID)
{
HandleSocketNodeErrors(srcErrCode);
}
else if (eventuuid == PVProtocolEngineNodeErrorEventTypesUUID)
{
HandleProtocolEngineNodeErrors(srcErrCode);
}
}
}
}
}
}
}
void pvplayer_async_test_ppb_base::HandleSocketNodeErrors(int32 aErr)
{
if (aErr == PVMFSocketNodeErrorSocketServerCreateError)
{
fprintf(iTestMsgOutputFile, "PVMFSocketNodeErrorSocketServerCreateError\n");
}
else if (aErr == PVMFSocketNodeErrorSocketServConnectError)
{
fprintf(iTestMsgOutputFile, "PVMFSocketNodeErrorSocketServConnectError\n");
}
else if (aErr == PVMFSocketNodeErrorUDPSocketRecvError)
{
fprintf(iTestMsgOutputFile, "PVMFSocketNodeErrorUDPSocketRecvError\n");
}
else if (aErr == PVMFSocketNodeErrorUDPSocketSendError)
{
fprintf(iTestMsgOutputFile, "PVMFSocketNodeErrorUDPSocketSendError\n");
}
else if (aErr == PVMFSocketNodeError_TCPSocketConnect)
{
fprintf(iTestMsgOutputFile, "PVMFSocketNodeError_TCPSocketConnect\n");
}
else if (aErr == PVMFSocketNodeError_DNSLookup)
{
fprintf(iTestMsgOutputFile, "PVMFSocketNodeError_DNSLookup\n");
}
else if (aErr == PVMFSocketNodeErrorSocketFailure)
{
fprintf(iTestMsgOutputFile, "PVMFSocketNodeErrorSocketFailure\n");
}
else if (aErr == PVMFSocketNodeErrorSocketTimeOut)
{
fprintf(iTestMsgOutputFile, "PVMFSocketNodeErrorSocketTimeOut\n");
}
else if (aErr == PVMFSocketNodeErrorInvalidPortTag)
{
fprintf(iTestMsgOutputFile, "PVMFSocketNodeErrorInvalidPortTag\n");
}
else if (aErr == PVMFSocketNodeErrorInvalidPortConfig)
{
fprintf(iTestMsgOutputFile, "PVMFSocketNodeErrorInvalidPortConfig\n");
}
else
{
fprintf(iTestMsgOutputFile, "PVMFSocketNode- Unknown Error Code\n");
}
}
void pvplayer_async_test_ppb_base::HandleProtocolEngineNodeErrors(int32 aErr)
{
// The HTTP status errors are propagated up from the Protocol Engine node and
// are enumerated in pvmf_protocol_engine_node_events.h. The raw value of the error
// code can be calculated as an offset from aErr - PVProtocolEngineNodeErrorEventStart.
if ((aErr >= PVProtocolEngineNodeErrorHTTPErrorCode400) &&
(aErr <= PVProtocolEngineNodeErrorHTTPCode4xxUnknown))
{
fprintf(file, " ERROR: PVProtocolEngineNodeError4xx HTTP Status Code %d\n",
aErr - PVProtocolEngineNodeErrorEventStart);
}
else if ((aErr >= PVProtocolEngineNodeErrorHTTPErrorCode500) &&
(aErr < PVProtocolEngineNodeErrorHTTPCode5xxUnknownStart))
{
fprintf(file, " ERROR: PVProtocolEngineNodeError5xx HTTP Status Code %d\n",
aErr - PVProtocolEngineNodeErrorEventStart);
}
else if ((aErr >= PVProtocolEngineNodeErrorHTTPRedirectCodeStart) &&
(aErr <= PVProtocolEngineNodeErrorHTTPRedirectCodeEnd))
{
fprintf(file, " ERROR IN REDIRECT: PVProtocolEngineNodeError3xx HTTP Status Code %d\n",
aErr - PVProtocolEngineNodeErrorEventStart);
}
else if (aErr < PVProtocolEngineNodeErrorNotHTTPErrorStart || aErr > PVProtocolEngineNodeErrorNotHTTPErrorEnd)
{
fprintf(file, " ERROR: PVProtocolEngineNodeError HTTP Unknown Status Code %d\n",
aErr - PVProtocolEngineNodeErrorEventStart);
}
else
{
fprintf(file, " ERROR: PVProtocolEngineNodeError General Error %d\n", aErr);
}
}
void pvplayer_async_test_ppb_base::PrintJanusError(const PVCmdResponse& aResp)
{
OSCL_UNUSED_ARG(aResp);
}
void pvplayer_async_test_ppb_base::HandleErrorEvent(const PVAsyncErrorEvent& aEvent)
{
switch (aEvent.GetEventType())
{
case PVMFErrResourceConfiguration:
// Just log the error
PVPATB_TEST_IS_TRUE(false);
fprintf(file, " GOT PVMFErrResourceConfiguration error event\n");
break;
case PVMFErrResource:
// Just log the error
PVPATB_TEST_IS_TRUE(false);
fprintf(file, " GOT PVMFErrResource error event\n");
break;
case PVMFErrCorrupt:
// Just log the error
PVPATB_TEST_IS_TRUE(false);
fprintf(file, " GOT PVMFErrCorrupt error event\n");
break;
case PVMFErrProcessing:
// Just log the error
PVPATB_TEST_IS_TRUE(false);
fprintf(file, " GOT PVMFErrProcessing error event\n");
break;
case PVMFErrTimeout:
PVPATB_TEST_IS_TRUE(false);
fprintf(file, " GOT PVMFErrTimeout error event");
break;
default:
// Unknown error and just log the error
PVPATB_TEST_IS_TRUE(false);
break;
}
// Wait for engine to handle the error
Cancel();
}
void pvplayer_async_test_ppb_base::HandleInformationalEvent(const PVAsyncInformationalEvent& aEvent)
{
if (aEvent.GetEventType() == PVMFInfoErrorHandlingStart)
{
fprintf(file, "PVMFInfoErrorHandlingStart...\n");
}
if (aEvent.GetEventType() == PVMFInfoErrorHandlingComplete)
{
fprintf(file, "PVMFInfoErrorHandlingComplete...\n");
iState = STATE_CLEANUPANDCOMPLETE;
RunIfNotReady();
}
// Check for EOS event
if (aEvent.GetEventType() == PVMFInfoEndOfData)
{
PVInterface* iface = (PVInterface*)(aEvent.GetEventExtensionInterface());
if (iface == NULL)
{
return;
}
PVUuid infomsguuid = PVMFErrorInfoMessageInterfaceUUID;
PVMFErrorInfoMessageInterface* infomsgiface = NULL;
if (iface->queryInterface(infomsguuid, (PVInterface*&)infomsgiface) == true)
{
int32 infocode;
PVUuid infouuid;
infomsgiface->GetCodeUUID(infocode, infouuid);
if ((infouuid == PVPlayerErrorInfoEventTypesUUID) && (infocode == PVPlayerInfoEndOfClipReached))
{
fprintf(file, " GOT PVPlayerInfoEndOfClipReached EVENT\n");
iNumEOS++;
if (iState == STATE_STOP)
{
Cancel();
RunIfNotReady();
}
else if ((iState == STATE_PAUSE) && iSeekAfterStart)
{
iState = STATE_SETPLAYBACKRANGE_AFTERSTART;
RunIfNotReady();
}
else if ((iState == STATE_PAUSE_TWICE) && iSeekAfterStart)
{
// end of clip received before Pause() is called
// change the state
iState = STATE_SETPLAYBACKRANGE_AFTERSTART_TWICE;
RunIfNotReady();
}
}
}
}
//Print some events
switch (aEvent.GetEventType())
{
case PVMFInfoBufferingStatus:
{
int32 *percent = (int32*)aEvent.GetLocalBuffer();
if (*percent == 0 || *percent == 100)
{
fprintf(file, " PVMFInfoBufferingStatus %d\n", *percent);
}
else
{
fprintf(file, ".%d.", *percent);
}
// get buffer fullness
PVExclusivePtr eventData;
aEvent.GetEventData(eventData);
uint32 aBufferFullness = (uint32)(eventData);
fprintf(file, ".(%d%%).", aBufferFullness);
}
break;
case PVMFInfoBufferingStart:
fprintf(file, " PVMFInfoBufferingStart\n");
iNumBufferingStart++;
//we should only get one of these.
if (iNumBufferingStart == 2 && !iEOSStopPlay)
PVPATB_TEST_IS_TRUE(false);
break;
case PVMFInfoBufferingComplete:
{
PVExclusivePtr eventData;
aEvent.GetEventData(eventData);
uint32 contentSize = (uint32)(eventData);
iNumBufferingComplete++;
fprintf(file, " PVMFInfoBufferingComplete (contentSize=%d), iNumBufferingComplete=%d\n", contentSize, iNumBufferingComplete);
//we should only get one of these.
if (iNumBufferingComplete == 2 && !iEOSStopPlay && iLoopReq == 0)
PVPATB_TEST_IS_TRUE(false);
if (iNumBufferingComplete == 1)
{
// if seek after download complete or waiting for download complete
if ((iState == STATE_PAUSE_AFTERDOWNLOADCOMPLETE) || (iState == STATE_WAIT_FOR_BUFFCOMPLETE))
{
Cancel();
RunIfNotReady();
}
}
}
break;
case PVMFInfoDataReady:
iNumDataReady++;
fprintf(file, "\n PVMFInfoDataReady\n");
//special handling for very first data ready event.
if (iNumDataReady == 1)
{
if (iState == STATE_WAIT_FOR_DATAREADY)
{
Cancel();
RunIfNotReady();
}
}
break;
case PVMFInfoUnderflow:
iNumUnderflow++;
fprintf(file, "\n PVMFInfoUnderflow\n");
//we should not get underflow before data ready
if (iNumUnderflow == 1
&& iNumDataReady == 0)
PVPATB_TEST_IS_TRUE(false);
break;
case PVMFInfoContentLength:
{
PVExclusivePtr eventData;
aEvent.GetEventData(eventData);
uint32 contentSize = (uint32)(eventData);
fprintf(file, " PVMFInfoContentLength = %d\n", contentSize);
}
break;
case PVMFInfoContentTruncated:
{
PVExclusivePtr eventData;
aEvent.GetEventData(eventData);
uint32 downloadSize = (uint32)(eventData);
fprintf(file, "\n PVMFInfoContentTruncated! downloadSize = %d\n", downloadSize);
// check extension info code
PVMFErrorInfoMessageInterface *msg = NULL;
if (aEvent.GetEventExtensionInterface() &&
aEvent.GetEventExtensionInterface()->queryInterface(PVMFErrorInfoMessageInterfaceUUID, (PVInterface*&)msg))
{
//extract the event code and event UUID.
int32 eventcode;
PVUuid eventUuid;
msg->GetCodeUUID(eventcode, eventUuid);
if (eventUuid == PVPlayerErrorInfoEventTypesUUID)
{
PVMFErrorInfoMessageInterface* sourceNodeInfoIF = msg->GetNextMessage();
if (sourceNodeInfoIF != NULL)
{
PVUuid infoUUID;
int32 srcInfoCode;
sourceNodeInfoIF->GetCodeUUID(srcInfoCode, infoUUID);
if (infoUUID == PVMFPROTOCOLENGINENODEInfoEventTypesUUID &&
srcInfoCode == PVMFPROTOCOLENGINENODEInfo_TruncatedContentByServerDisconnect)
{
fprintf(file, " PVMFInfoContentTruncated! TruncatedContentByServerDisconnect!\n");
}
}
}
}
}
break;
case PVMFInfoContentType:
{
PVExclusivePtr eventData;
aEvent.GetEventData(eventData);
char *constentType = (char *)(eventData);
fprintf(file, " PVMFInfoContentType = %s\n", constentType);
}
break;
case PVMFInfoUnexpectedData:
fprintf(file, " PVMFInfoUnexpectedData! Downloaded more data than content-length\n");
if (iNumBufferingComplete == 0) PVPATB_TEST_IS_TRUE(false); // we should get this info event after buffer complete event
break;
case PVMFInfoSessionDisconnect:
fprintf(file, " PVMFInfoSessionDisconnect! Got server disconnect after download is complete\n");
if (iNumBufferingComplete == 0) PVPATB_TEST_IS_TRUE(false); // we should get this info event after buffer complete event
break;
case PVMFInfoRemoteSourceNotification:
{
//Examine the extended info message to see if this is the
//"not progressive downloadable" event. If so, notify the
//UI. They may choose to abort the download at this point.
PVMFErrorInfoMessageInterface *msg = NULL;
if (aEvent.GetEventExtensionInterface()
&& aEvent.GetEventExtensionInterface()->queryInterface(PVMFErrorInfoMessageInterfaceUUID, (PVInterface*&)msg))
{
//extract the event code and event UUID.
int32 eventcode;
PVUuid eventUuid;
msg->GetCodeUUID(eventcode, eventUuid);
if (eventUuid == PVPlayerErrorInfoEventTypesUUID)
{
PVMFErrorInfoMessageInterface* sourceNodeInfoIF =
msg->GetNextMessage();
if (sourceNodeInfoIF != NULL)
{
PVUuid infoUUID;
int32 srcInfoCode;
sourceNodeInfoIF->GetCodeUUID(srcInfoCode, infoUUID);
if (infoUUID == PVMFFileFormatEventTypesUUID
&& srcInfoCode == PVMFMP4FFParserInfoNotPseudostreamableFile)
{
fprintf(file, " PVMFInfoRemoteSourceNotification (not progressive-downloadable)\n");
}
else if (infoUUID == PVMFPROTOCOLENGINENODEInfoEventTypesUUID
&& (srcInfoCode >= PVMFPROTOCOLENGINENODEInfo_HTTPRedirectCode300 &&
srcInfoCode <= PVMFPROTOCOLENGINENODEInfo_HTTPRedirectCode307))
{
PVExclusivePtr eventData;
aEvent.GetEventData(eventData);
char *redirectUrl = (char *)(eventData);
fprintf(file, " PVMFInfoRemoteSourceNotification (HTTP Status code = %d), redirectUrl = %s\n",
srcInfoCode - PVMFPROTOCOLENGINENODEInfo_Redirect, redirectUrl);
}
}
}
}
}
break;
case PVMFInfoDurationAvailable:
{
PVMFDurationInfoMessageInterface* eventMsg = NULL;
PVInterface* infoExtInterface = aEvent.GetEventExtensionInterface();
if (infoExtInterface &&
infoExtInterface->queryInterface(PVMFDurationInfoMessageInterfaceUUID, (PVInterface*&)eventMsg))
{
PVUuid eventuuid;
int32 infoCode;
eventMsg->GetCodeUUID(infoCode, eventuuid);
if (eventuuid == PVMFDurationInfoMessageInterfaceUUID)
{
iSessionDuration = eventMsg->GetDuration();
}
}
}
break;
default:
break;
}
}
//
// pvplayer_async_test_ppb_normal
//
pvplayer_async_test_ppb_normal::~pvplayer_async_test_ppb_normal()
{
iDownloadContextData = NULL;
}
void pvplayer_async_test_ppb_normal::CreateDataSource()
{
OSCL_HeapString<OsclMemAllocator> url(iFileName);
OSCL_HeapString<OsclMemAllocator> default_source(SOURCENAME_PREPEND_STRING);
default_source += DEFAULTSOURCEFILENAME;
if (url == default_source)
{
fprintf(file, "Setting source to %s\n", DEFAULT_3GPP_PPB_URL);
url = DEFAULT_3GPP_PPB_URL;
}
oscl_wchar wbuf[2];
wbuf[1] = '\0';
for (uint32 i = 0; i < url.get_size(); i++)
{
wbuf[0] = (oscl_wchar)url.get_cstr()[i];
iDownloadURL += wbuf;
}
iDataSource = new PVPlayerDataSourceURL;
iDataSource->SetDataSourceURL(iDownloadURL);
iDataSource->SetDataSourceFormatType(PVMF_MIME_DATA_SOURCE_HTTP_URL);
iDownloadFilename = NULL;
iDownloadProxy = _STRLIT_CHAR("");
int32 iDownloadProxyPort = 0;
iDownloadConfigFilename = OUTPUTNAME_PREPEND_WSTRING;
iDownloadConfigFilename += _STRLIT_WCHAR("my3gp_ppb_normal.cfg");
iContentTooLarge = false;
uint32 iMaxFileSize = 0x7FFFFFFF;
bool aIsNewSession = true;
iDownloadContextData = new PVMFSourceContextData();
iDownloadContextData->EnableCommonSourceContext();
iDownloadContextData->EnableDownloadHTTPSourceContext();
iDownloadContextData->DownloadHTTPData()->bIsNewSession = aIsNewSession;
iDownloadContextData->DownloadHTTPData()->iConfigFileName = iDownloadConfigFilename;
iDownloadContextData->DownloadHTTPData()->iDownloadFileName = iDownloadFilename;
iDownloadContextData->DownloadHTTPData()->iMaxFileSize = iMaxFileSize;
iDownloadContextData->DownloadHTTPData()->iProxyName = iDownloadProxy;
iDownloadContextData->DownloadHTTPData()->iProxyPort = iDownloadProxyPort;
iDownloadContextData->DownloadHTTPData()->iPlaybackControl = PVMFSourceContextDataDownloadHTTP::ENoSaveToFile;
iDownloadContextData->CommonData()->iUseCPMPluginRegistry = false;
iDataSource->SetDataSourceContextData(iDownloadContextData);
}
void pvplayer_async_test_ppb_normal::CreateDataSinkVideo()
{
OSCL_wHeapString<OsclMemAllocator> sinkfile = OUTPUTNAME_PREPEND_WSTRING;
sinkfile += _STRLIT_WCHAR("test_player_3gp_ppb_");
if (iShortPauseResume)
{
sinkfile += _STRLIT_WCHAR("sht_ps_rsm_");
}
else if (iLongPauseResume)
{
sinkfile += _STRLIT_WCHAR("lng_ps_rsm_");
}
if (iSeekAfterStart)
{
sinkfile += _STRLIT_WCHAR("sk_aft_strt_");
}
else if (iSeekBeforeStart)
{
sinkfile += _STRLIT_WCHAR("sk_b4_strt_");
}
if (iForwardStep)
{
sinkfile += _STRLIT_WCHAR("fstp_");
}
if (iLoop)
{
sinkfile += _STRLIT_WCHAR("lp_");
}
if (iPlayUntilEOS)
{
sinkfile += _STRLIT_WCHAR("utl_eos_video.dat");
}
else
{
sinkfile += _STRLIT_WCHAR("nml_video.dat");
}
iMIOFileOutVideo = iMioFactory->CreateVideoOutput((OsclAny*) & sinkfile, MEDIATYPE_VIDEO, iCompressedVideo);
iIONodeVideo = PVMediaOutputNodeFactory::CreateMediaOutputNode(iMIOFileOutVideo);
iDataSinkVideo = new PVPlayerDataSinkPVMFNode;
((PVPlayerDataSinkPVMFNode*)iDataSinkVideo)->SetDataSinkNode(iIONodeVideo);
}
void pvplayer_async_test_ppb_normal::CreateDataSinkAudio()
{
OSCL_wHeapString<OsclMemAllocator> sinkfile = OUTPUTNAME_PREPEND_WSTRING;
sinkfile += _STRLIT_WCHAR("test_player_3gp_ppb_");
if (iShortPauseResume)
{
sinkfile += _STRLIT_WCHAR("sht_ps_rsm_");
}
else if (iLongPauseResume)
{
sinkfile += _STRLIT_WCHAR("lng_ps_rsm_");
}
if (iSeekAfterStart)
{
sinkfile += _STRLIT_WCHAR("sk_aft_strt_");
}
else if (iSeekBeforeStart)
{
sinkfile += _STRLIT_WCHAR("sk_b4_strt_");
}
if (iForwardStep)
{
sinkfile += _STRLIT_WCHAR("fstp_");
}
if (iLoop)
{
sinkfile += _STRLIT_WCHAR("lp_");
}
if (iPlayUntilEOS)
{
sinkfile += _STRLIT_WCHAR("utl_eos_audio.dat");
}
else
{
sinkfile += _STRLIT_WCHAR("nml_audio.dat");
}
iMIOFileOutAudio = iMioFactory->CreateAudioOutput((OsclAny*) & sinkfile, MEDIATYPE_AUDIO, iCompressedAudio);
iIONodeAudio = PVMediaOutputNodeFactory::CreateMediaOutputNode(iMIOFileOutAudio);
iDataSinkAudio = new PVPlayerDataSinkPVMFNode;
((PVPlayerDataSinkPVMFNode*)iDataSinkAudio)->SetDataSinkNode(iIONodeAudio);
}
//
// pvplayer_async_test_PDLPauseResumeAfterUnderFlow section
//
pvplayer_async_test_PDLPauseResumeAfterUnderFlow::~pvplayer_async_test_PDLPauseResumeAfterUnderFlow()
{
}
void pvplayer_async_test_PDLPauseResumeAfterUnderFlow::CreateDataSource()
{
OSCL_HeapString<OsclMemAllocator> url(iFileName);
OSCL_HeapString<OsclMemAllocator> default_source(SOURCENAME_PREPEND_STRING);
default_source += DEFAULTSOURCEFILENAME;
if (url == default_source)
{
fprintf(file, "Setting source to %s\n", DEFAULT_3GPPDL_URL);
url = DEFAULT_3GPPDL_URL;
}
oscl_wchar wbuf[2];
wbuf[1] = '\0';
for (uint32 i = 0;i < url.get_size();i++)
{
wbuf[0] = (oscl_wchar)url.get_cstr()[i];
iDownloadURL += wbuf;
}
iDataSource = new PVPlayerDataSourceURL;
iDataSource->SetDataSourceURL(iDownloadURL);
if (iProtocolRollOver == true)
{
iDataSource->SetDataSourceFormatType(PVMF_MIME_DATA_SOURCE_MS_HTTP_STREAMING_URL);
iDataSource->SetAlternateSourceFormatType(PVMF_MIME_DATA_SOURCE_HTTP_URL);
}
else
{
iDataSource->SetDataSourceFormatType(PVMF_MIME_DATA_SOURCE_HTTP_URL);
}
iDownloadFilename = OUTPUTNAME_PREPEND_WSTRING;
iDownloadFilename += _STRLIT_WCHAR("test_3gppdownload.loc");
int32 iDownloadProxyPort;
#if PVPLAYER_TEST_ENABLE_PROXY
iDownloadProxy = _STRLIT_CHAR("");
iDownloadProxyPort = 7070;
#else
iDownloadProxy = _STRLIT_CHAR("");
iDownloadProxyPort = 0;
#endif
iDownloadConfigFilename = OUTPUTNAME_PREPEND_WSTRING;
iDownloadConfigFilename += _STRLIT_WCHAR("my3gppdl.cfg");
iContentTooLarge = false;
uint32 iMaxFileSize = 0x7FFFFFFF;
bool aIsNewSession = true;
iPauseResumeAfterUnderflow = true;
iDownloadContextData = new PVMFSourceContextData();
iDownloadContextData->EnableCommonSourceContext();
iDownloadContextData->EnableDownloadHTTPSourceContext();
iDownloadContextData->DownloadHTTPData()->bIsNewSession = aIsNewSession;
iDownloadContextData->DownloadHTTPData()->iConfigFileName = iDownloadConfigFilename;
iDownloadContextData->DownloadHTTPData()->iDownloadFileName = iDownloadFilename;
iDownloadContextData->DownloadHTTPData()->iMaxFileSize = iMaxFileSize;
iDownloadContextData->DownloadHTTPData()->iProxyName = iDownloadProxy;
iDownloadContextData->DownloadHTTPData()->iProxyPort = iDownloadProxyPort;
iDownloadContextData->DownloadHTTPData()->iUserID = _STRLIT_CHAR("abc");
iDownloadContextData->DownloadHTTPData()->iUserPasswd = _STRLIT_CHAR("xyz");
iDownloadContextData->DownloadHTTPData()->iPlaybackControl = PVMFSourceContextDataDownloadHTTP::EAsap;
iDownloadContextData->CommonData()->iUseCPMPluginRegistry = false;
iDataSource->SetDataSourceContextData(iDownloadContextData);
}
void pvplayer_async_test_PDLPauseResumeAfterUnderFlow::CreateDataSinkVideo()
{
OSCL_wHeapString<OsclMemAllocator> sinkfile = OUTPUTNAME_PREPEND_WSTRING;
sinkfile += _STRLIT_WCHAR("test_player_3gppdlnormal_video.dat");
iMIOFileOutVideo = iMioFactory->CreateVideoOutput((OsclAny*) & sinkfile, MEDIATYPE_VIDEO, iCompressedVideo);
iIONodeVideo = PVMediaOutputNodeFactory::CreateMediaOutputNode(iMIOFileOutVideo);
iDataSinkVideo = new PVPlayerDataSinkPVMFNode;
((PVPlayerDataSinkPVMFNode*)iDataSinkVideo)->SetDataSinkNode(iIONodeVideo);
}
void pvplayer_async_test_PDLPauseResumeAfterUnderFlow::CreateDataSinkAudio()
{
OSCL_wHeapString<OsclMemAllocator> sinkfile = OUTPUTNAME_PREPEND_WSTRING;
sinkfile += _STRLIT_WCHAR("test_player_3gppdlnormal_audio.dat");
iMIOFileOutAudio = iMioFactory->CreateAudioOutput((OsclAny*) & sinkfile, MEDIATYPE_AUDIO, iCompressedAudio);
iIONodeAudio = PVMediaOutputNodeFactory::CreateMediaOutputNode(iMIOFileOutAudio);
iDataSinkAudio = new PVPlayerDataSinkPVMFNode;
((PVPlayerDataSinkPVMFNode*)iDataSinkAudio)->SetDataSinkNode(iIONodeAudio);
}
void pvplayer_async_test_PDLPauseResumeAfterUnderFlow::CleanupData()
{
}