43 #define MAX_MEASURE_SIZE (0x7fffffff) 50 #define GOOD_MAGIC 0xdeadbeef 51 #define BAD_MAGIC 0xfefefefe 52 #define SET_MAGIC(r) do { r->magic = GOOD_MAGIC; } while (0) 53 #define VERIFY_MAGIC(r) assert(r->magic == GOOD_MAGIC) 54 #define CLEAR_MAGIC(r) do { r->magic = BAD_MAGIC; } while (0) 57 #define VERIFY_MAGIC(r) 58 #define CLEAR_MAGIC(r) 99 static BOOLEAN HeaderCallback(
void *userdata, U32BIT downloadId,
101 static BOOLEAN ContentCallback(
void *userdata, U32BIT downloadId,
103 static BOOLEAN HandleMeasureData(
MeasureRequest *request, U32BIT bytes);
121 char rangeBuffer[MHEG5_MAX_RANGE_BUFFER];
126 request = MHEG5getMem(
sizeof *request);
134 request->requestId = requestId;
136 request->handle = NULL;
138 request->status = HTTP_STATUS_OTHER_ERROR;
140 request->startTime = 0;
141 request->finishTime = 0;
143 request->next = measureRequestList;
144 measureRequestList = request;
146 strcpy(rangeBuffer,
"0-");
149 sprintf(&rangeBuffer[2],
"%d", (
int)maxBytes);
153 maxBytes = 0x7fffffff;
156 ULL_Set32(request->receivedBytes, 0);
157 ULL_Set32(request->maxReceivedBytes, maxBytes);
160 (U8BIT *)rangeBuffer,
165 if (request->handle != NULL)
167 downloadId = request->downloadId;
172 MHEG5freeMem(request);
189 request = FindRequestById(downloadId);
192 VERIFY_MAGIC(request);
194 assert(request->handle != NULL);
210 request = FindRequestById(downloadId);
213 VERIFY_MAGIC(request);
215 code = request->code;
229 S32BIT status = HTTP_STATUS_OTHER_ERROR;
231 request = FindRequestById(downloadId);
234 VERIFY_MAGIC(request);
236 status = request->status;
251 U8BIT *redirectUrl = NULL;
253 request = FindRequestById(downloadId);
256 VERIFY_MAGIC(request);
273 U32BIT timeDiff, speed;
275 request = FindRequestById(downloadId);
279 if (ULL_IsValid(request->receivedBytes))
281 timeDiff = request->finishTime - request->startTime;
290 numerator = request->receivedBytes;
291 ULL_Mul32(numerator, 1000);
292 ULL_Div32(numerator, timeDiff);
293 speed = ULL_Get32(numerator);
314 request = FindRequestById(downloadId);
317 VERIFY_MAGIC(request);
319 assert(request->handle != NULL);
333 pRequest = &measureRequestList;
334 while (*pRequest != NULL)
337 if (request->downloadId == downloadId)
339 VERIFY_MAGIC(request);
341 assert(request->handle != NULL);
343 request->handle = NULL;
345 *pRequest = request->next;
346 MHEG5freeMem(request);
352 pRequest = &request->next;
371 request = measureRequestList;
372 while (request != NULL && request->downloadId != downloadId)
374 request = request->next;
387 static BOOLEAN HeaderCallback(
void *userdata, U32BIT downloadId,
392 VERIFY_MAGIC(request);
394 if (response->data_len <= 2)
397 request->code = response->code;
410 static BOOLEAN ContentCallback(
void *userdata, U32BIT downloadId,
416 VERIFY_MAGIC(request);
418 if (response->status == HTTP_STATUS_WAIT)
420 more = HandleMeasureData(request, response->data_len);
424 more = HandleMeasureEnd(request, response);
436 static BOOLEAN HandleMeasureData(
MeasureRequest *request, U32BIT bytes)
442 if (request->code == 200 || request->code == 206)
445 ULL_Add32(request->receivedBytes, bytes);
447 if (ULL_Compare(request->receivedBytes,
448 request->maxReceivedBytes) >= 0)
459 request->status = HTTP_STATUS_OK;
465 event.data_type = DT_VALUE;
466 event.data.streamer.requestId = request->downloadId;
467 event.data.streamer.eventType = MHEG5_STREAMER_EVENT_MSP_DOWNLOAD_DONE;
469 cqu_err =
VQ_PutMsg(&event, PRTY_NORMAL);
470 if (cqu_err != MHERR_OK)
472 DBG((
"HandleMeasureData: Cannot send MHEG5_STREAMER_EVENT_MSP_DOWNLOAD_DONE event\n"));
492 if (request->finishTime == 0)
495 request->status = response->status;
501 event.data_type = DT_VALUE;
502 event.data.streamer.requestId = request->downloadId;
503 event.data.streamer.eventType = MHEG5_STREAMER_EVENT_MSP_DOWNLOAD_DONE;
505 cqu_err =
VQ_PutMsg(&event, PRTY_NORMAL);
506 if (cqu_err != MHERR_OK)
508 DBG((
"HandleMeasureEnd: Cannot send MHEG5_STREAMER_EVENT_MSP_DOWNLOAD_DONE event %d\n", cqu_err));
U32BIT STB_OSGetClockMilliseconds(void)
Get Current Computer Clock Time.
E_MhegErr VQ_PutMsg(S_MhegMessage *pMsg, E_PRIORITY priority)
Post event or section message on queue. Copies data into queue.
void MHEG5StopMeasureRequest(U32BIT downloadId)
Stop HTTP streaming performance measurement request.
Utilitiy functions for IC Streamer.
U32BIT MHEG5GetUniqueId(void)
Return a unique ID. The ID is a non-zero 32-bit value. It is guaranteed to be unique for the first 0x...
void httpStartRequest(HttpRequest_t request)
Start an HTTP request. Everything related to the request is passed through the callback that was regi...
Manages the interface between MHEG5 Engine and the HTTP component.
Common header internal to IC streamer.
S32BIT MHEG5GetMeasureStatus(U32BIT downloadId)
Return HTTP status of performance measurement request.
void MHEG5StartMeasureRequest(U32BIT downloadId)
Start HTTP streaming performance measurement request.
void(* F_MSG_PROCESS)(void *data)
Function to Process voyager message.
U8BIT * MHEG5GetMeasureRedirect(U32BIT downloadId)
Return the redirection URL for a request that was redirected (HTTP status 3xx).
U8BIT * httpGetRequestRedirect(HttpRequest_t request)
Return the URL that the request is redirected to (valid only for response codes of 3xx)...
This file defines the profile for the MHEG engine.
S32BIT MHEG5GetMeasureResponseCode(U32BIT downloadId)
Return response code for performance measurement request.
void MHEG5DestroyMeasureRequest(U32BIT downloadId)
Destroy HTTP streaming performance measurement request.
void httpStopRequest(HttpRequest_t request)
Stop an HTTP request. This function does not destroy the request; this is done using httpDestroyReque...
U32BIT MHEG5CreateMeasureRequest(U32BIT requestId, char *url, S32BIT maxBytes)
Create HTTP streaming performance measurement request.
void httpDestroyRequest(HttpRequest_t request)
Destroy an HTTP request.
IC Streamer performance measurement.
void MHEG5StreamerHandle(MHEG5StreamerEventParams_t *params)
Process an MHEG5StreamerEvent message The event is passed onto the streamer module for processing...
void MHEG5StreamerNotifyStreamingPerformance(U32BIT requestId, U32BIT speed)
Notify measured streaming performance (speed).
HttpRequest_t httpCreateStreamRequest(U8BIT *url, U8BIT *range, HttpCallback_t header_callback, HttpCallback_t callback, U32BIT request_id, void *userdata)
Create an HTTP request for stream media.
void MHEG5ProcessMeasureRequest(U32BIT downloadId)
Process HTTP streaming performance measurement request.
Header file - Function prototypes for operating system.