| /* ------------------------------------------------------------------ |
| * 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. |
| * ------------------------------------------------------------------- |
| */ |
| // ---------------------------------------------------------------------- |
| // |
| // This Software is an original work of authorship of PacketVideo Corporation. |
| // Portions of the Software were developed in collaboration with NTT DoCoMo, |
| // Inc. or were derived from the public domain or materials licensed from |
| // third parties. Title and ownership, including all intellectual property |
| // rights in and to the Software shall remain with PacketVideo Corporation |
| // and NTT DoCoMo, Inc. |
| // |
| // ----------------------------------------------------------------------- |
| // ============================================================ |
| // FILE: AnalyzePER.c |
| // |
| // DESCRIPTION: PER analysis support routines. |
| // These routines provide support for the automatically |
| // generated functions in h245_analysis.[ch]. |
| // |
| // Written by Ralph Neff, PacketVideo, 3/6/2000 |
| // (c) 2000 PacketVideo Corp. |
| // ============================================================ |
| |
| #include "oscl_base.h" |
| #include "per_headers.h" |
| #include "genericper.h" |
| #include "analyzeper.h" |
| |
| #ifdef PVANALYZER // Analyzer interface function |
| #include <tchar.h> |
| void PVAnalyzer(unsigned int tag, Tint8 *message_fmt, ...); |
| #endif |
| |
| /* --------------------------------------------- */ |
| /* ----------- BASE LEVEL int32ERFACE ------------ */ |
| /* --------------------------------------------- */ |
| |
| /* |
| void MyPVAnalyzer(uint16 tag, uint8 *outString) |
| { |
| FILE *fp = fopen("analyzer.txt","a"); |
| fprintf(fp, outString); |
| fprintf(fp, "\n"); |
| fclose(fp); |
| } |
| */ |
| |
| // ========================================================= |
| // Show245() |
| // |
| // This function takes an output analysis line, adds the |
| // proper indent, and sends the result out to the display |
| // routine. The 'tag' argument is simply passed on. |
| // ========================================================= |
| void Show245(uint16 tag, uint16 indent, const char* inString) |
| { |
| OSCL_UNUSED_ARG(tag); |
| OSCL_UNUSED_ARG(indent); |
| OSCL_UNUSED_ARG(inString); |
| #ifdef PVANALYZER //07/12/01wjj |
| uint32 i; |
| uint8 outString[200]; |
| |
| /* Construct outString with proper indent */ |
| for (i = 0; i < indent; ++i) |
| { |
| outString[i] = ' '; |
| } |
| sprintf(outString + i, "%s", inString); |
| |
| //#ifdef PVANALYZER //07/12/01wjj |
| /* Send outString to display */ |
| PVAnalyzer(tag, outString); /* The real deal */ |
| #endif |
| } |
| |
| // ========================================================= |
| // ShowHexData() |
| // |
| // This function shows a hex dump of a string of uint8s. |
| // The resulting output line(s) gets displayed by call to |
| // Show245(). The first two input arguments (tag, indent) |
| // are simply passed through. |
| // ========================================================= |
| void ShowHexData(uint16 tag, uint16 indent, uint16 size, uint8* data) |
| { |
| OSCL_UNUSED_ARG(tag); |
| OSCL_UNUSED_ARG(indent); |
| OSCL_UNUSED_ARG(size); |
| OSCL_UNUSED_ARG(data); |
| #ifdef PVANALYZER //07/12/01wjj |
| uint32 i; |
| uint8 outString[100]; |
| |
| for (i = 0; i < size; ++i) |
| { |
| sprintf(outString + 3*(i % 16), "%02x ", data[i]); |
| if ((i % 16) == 15 || (i + 1) == size) |
| { |
| outString[3*(i%16+1)] = '\0'; |
| Show245(tag, indent, outString); |
| } |
| } |
| #endif |
| } |
| |
| /* --------------------------------------------- */ |
| /* ----------- LOW LEVEL OBJECTS --------------- */ |
| /* --------------------------------------------- */ |
| |
| // ========================================================= |
| // ShowPERNull() |
| // |
| // This function displays a NULL object via call to Show245(). |
| // ========================================================= |
| void ShowPERNull(uint16 tag, uint16 indent, const char* label) |
| { |
| OSCL_UNUSED_ARG(tag); |
| OSCL_UNUSED_ARG(indent); |
| OSCL_UNUSED_ARG(label); |
| #ifdef PVANALYZER //07/12/01wjj |
| uint8 outString[100]; |
| |
| sprintf(outString, "%s = NULL", label); |
| Show245(tag, indent, outString); |
| #endif |
| } |
| |
| // ========================================================= |
| // ShowPERBoolean() |
| // |
| // This function displays a BOOLEAN object via call to |
| // Show245(). |
| // ========================================================= |
| void ShowPERBoolean(uint16 tag, uint16 indent, const char* label, uint32 value) |
| { |
| OSCL_UNUSED_ARG(tag); |
| OSCL_UNUSED_ARG(indent); |
| OSCL_UNUSED_ARG(label); |
| OSCL_UNUSED_ARG(value); |
| #ifdef PVANALYZER //07/12/01wjj |
| uint8 outString[100]; |
| |
| if (value) |
| { |
| sprintf(outString, "%s = TRUE", label); |
| } |
| else |
| { |
| sprintf(outString, "%s = FALSE", label); |
| } |
| Show245(tag, indent, outString); |
| #endif |
| } |
| |
| // ========================================================= |
| // ShowPERInteger() |
| // |
| // This function displays an int32EGER object via call to |
| // Show245(). |
| // ========================================================= |
| void ShowPERInteger(uint16 tag, uint16 indent, const char* label, uint32 value) |
| { |
| OSCL_UNUSED_ARG(tag); |
| OSCL_UNUSED_ARG(indent); |
| OSCL_UNUSED_ARG(label); |
| OSCL_UNUSED_ARG(value); |
| #ifdef PVANALYZER //07/12/01wjj |
| uint8 outString[100]; |
| |
| sprintf(outString, "%s = %u", label, value); |
| Show245(tag, indent, outString); |
| #endif |
| } |
| |
| // ========================================================= |
| // ShowPERSignedInteger() |
| // |
| // This function displays the signed variant of an int32EGER |
| // object via call to Show245(). |
| // ========================================================= |
| void ShowPERSignedInteger(uint16 tag, uint16 indent, const char* label, int32 value) |
| { |
| OSCL_UNUSED_ARG(tag); |
| OSCL_UNUSED_ARG(indent); |
| OSCL_UNUSED_ARG(label); |
| OSCL_UNUSED_ARG(value); |
| #ifdef PVANALYZER //07/12/01wjj |
| uint8 outString[100]; |
| |
| sprintf(outString, "%s = %d", label, value); |
| Show245(tag, indent, outString); |
| #endif |
| } |
| |
| // ========================================================= |
| // ShowPERUnboundedInteger() |
| // |
| // This function displays the unbounded variant of an int32EGER |
| // object via call to Show245(). We currently take the |
| // input type to be uint32. |
| // ========================================================= |
| void ShowPERUnboundedInteger(uint16 tag, uint16 indent, const char* label, uint32 value) |
| { |
| OSCL_UNUSED_ARG(tag); |
| OSCL_UNUSED_ARG(indent); |
| OSCL_UNUSED_ARG(label); |
| OSCL_UNUSED_ARG(value); |
| #ifdef PVANALYZER //07/12/01wjj |
| uint8 outString[100]; |
| |
| sprintf(outString, "%s = %u", label, value); |
| Show245(tag, indent, outString); |
| #endif |
| } |
| |
| // ========================================================= |
| // ShowPEROctetString() |
| // |
| // This function displays an OCTETSTRING object via call |
| // to Show245(). |
| // ========================================================= |
| void ShowPEROctetString(uint16 tag, uint16 indent, const char* label, PS_OCTETSTRING x) |
| { |
| OSCL_UNUSED_ARG(tag); |
| OSCL_UNUSED_ARG(indent); |
| OSCL_UNUSED_ARG(label); |
| OSCL_UNUSED_ARG(x); |
| #ifdef PVANALYZER //07/12/01wjj |
| uint8 outString[100]; |
| |
| sprintf(outString, "%s is an OCTET STRING (SIZE = %hu)", |
| label, x->size); |
| Show245(tag, indent, outString); |
| ShowHexData(tag, (uint16)(indent + 2), x->size, x->data); |
| #endif |
| } |
| |
| // ========================================================= |
| // ShowPERBitString() |
| // |
| // This function displays a BITSTRING object via calls |
| // to Show245(). |
| // ========================================================= |
| void ShowPERBitString(uint16 tag, uint16 indent, const char *label, PS_BITSTRING x) |
| { |
| OSCL_UNUSED_ARG(tag); |
| OSCL_UNUSED_ARG(indent); |
| OSCL_UNUSED_ARG(label); |
| OSCL_UNUSED_ARG(x); |
| #ifdef PVANALYZER //07/12/01wjj |
| uint8 outString[100]; |
| |
| sprintf(outString, "%s is a BIT STRING (SIZE = %hu)", |
| label, x->size); |
| Show245(tag, indent, outString); |
| ShowHexData(tag, (uint16)(indent + 2), (uint16)(x->size / 8), x->data); |
| #endif |
| } |
| |
| // ========================================================= |
| // ShowPERCharString() |
| // |
| // This function displays a int8STRING object via calls |
| // to Show245(). |
| // ========================================================= |
| void ShowPERCharString(uint16 tag, uint16 indent, const char* label, PS_int8STRING x) |
| { |
| OSCL_UNUSED_ARG(tag); |
| OSCL_UNUSED_ARG(indent); |
| OSCL_UNUSED_ARG(label); |
| OSCL_UNUSED_ARG(x); |
| #ifdef PVANALYZER //07/12/01wjj |
| uint8 outString[100]; |
| uint8 displayType = 1; /* Select output type -- See Below */ |
| |
| sprintf(outString, "%s is a int8 STRING (SIZE = %hu)", |
| label, x->size); |
| Show245(tag, indent, outString); |
| |
| if (displayType == 0) |
| { |
| /* Show Hex Version of string data */ |
| ShowHexData(tag, (uint16)(indent + 2), x->size, x->data); |
| } |
| else |
| { |
| /* Show Printable character version */ |
| sprintf(outString, "stringdata = \"%s\"", x->data); |
| Show245(tag, (uint16)(indent + 2), outString); |
| } |
| #endif |
| } |
| |
| // ========================================================= |
| // ShowPERObjectID() |
| // |
| // This function displays an OBJECT IDENTIFIER via calls |
| // to Show245(). |
| // ========================================================= |
| void ShowPERObjectID(uint16 tag, uint16 indent, const char* label, PS_OBJECTIDENT x) |
| { |
| OSCL_UNUSED_ARG(tag); |
| OSCL_UNUSED_ARG(indent); |
| OSCL_UNUSED_ARG(label); |
| OSCL_UNUSED_ARG(x); |
| #ifdef PVANALYZER //07/12/01wjj |
| uint8 outString[100]; |
| |
| sprintf(outString, "%s is an OBJECT IDENTIFIER (SIZE = %hu)", |
| label, x->size); |
| Show245(tag, indent, outString); |
| ShowHexData(tag, (uint16)(indent + 2), x->size, x->data); |
| #endif |
| } |
| |
| /* --------------------------------------------- */ |
| /* ---------- HIGHER LEVEL OBJECTS ------------- */ |
| /* --------------------------------------------- */ |
| |
| // ========================================================= |
| // ShowPERChoice() |
| // |
| // This function displays the identity of a toplevel |
| // CHOICE definition. |
| // ========================================================= |
| void ShowPERChoice(uint16 tag, uint16 indent, const char *label, const char *typestring) |
| { |
| OSCL_UNUSED_ARG(tag); |
| OSCL_UNUSED_ARG(indent); |
| OSCL_UNUSED_ARG(label); |
| OSCL_UNUSED_ARG(typestring); |
| #ifdef PVANALYZER //07/12/01wjj |
| uint8 outString[100]; |
| |
| sprintf(outString, "%s = %s (CHOICE)", label, typestring); |
| Show245(tag, indent, outString); |
| #endif |
| } |
| |
| // ========================================================= |
| // ShowPERSequence() |
| // |
| // This function displays the identity of a toplevel |
| // SEQUENCE definition. |
| // ========================================================= |
| void ShowPERSequence(uint16 tag, uint16 indent, const char* label, const char* typestring) |
| { |
| OSCL_UNUSED_ARG(tag); |
| OSCL_UNUSED_ARG(indent); |
| OSCL_UNUSED_ARG(label); |
| OSCL_UNUSED_ARG(typestring); |
| #ifdef PVANALYZER //07/12/01wjj |
| uint8 outString[100]; |
| |
| sprintf(outString, "%s = %s (SEQUENCE)", label, typestring); |
| Show245(tag, indent, outString); |
| #endif |
| } |
| |
| // ========================================================= |
| // ShowPERSequenceof() |
| // |
| // This function displays the identity of a toplevel |
| // SEQUENCE OF definition. |
| // ========================================================= |
| void ShowPERSequenceof(uint16 tag, uint16 indent, const char* label, const char* typestring) |
| { |
| OSCL_UNUSED_ARG(tag); |
| OSCL_UNUSED_ARG(indent); |
| OSCL_UNUSED_ARG(label); |
| OSCL_UNUSED_ARG(typestring); |
| #ifdef PVANALYZER //07/12/01wjj |
| uint8 outString[100]; |
| |
| sprintf(outString, "%s = %s (SEQUENCE-OF)", label, typestring); |
| Show245(tag, indent, outString); |
| #endif |
| } |
| |
| // ========================================================= |
| // ShowPERSetof() |
| // |
| // This function displays the identity of a toplevel |
| // SET OF definition. |
| // ========================================================= |
| void ShowPERSetof(uint16 tag, uint16 indent, const char* label, const char* typestring) |
| { |
| OSCL_UNUSED_ARG(tag); |
| OSCL_UNUSED_ARG(indent); |
| OSCL_UNUSED_ARG(label); |
| OSCL_UNUSED_ARG(typestring); |
| #ifdef PVANALYZER //07/12/01wjj |
| uint8 outString[100]; |
| |
| sprintf(outString, "%s = %s (SET-OF)", label, typestring); |
| Show245(tag, indent, outString); |
| #endif |
| } |
| |
| // ========================================================= |
| // ShowPERClosure() |
| // |
| // This function displays the closure of a top level object. |
| // It should be called once with the existing (already |
| // incremented) indent level. |
| // ========================================================= |
| void ShowPERClosure(uint16 tag, uint16 indent, const char* label) |
| { |
| OSCL_UNUSED_ARG(tag); |
| OSCL_UNUSED_ARG(indent); |
| OSCL_UNUSED_ARG(label); |
| #ifdef PVANALYZER //07/12/01wjj |
| uint8 outString[100]; |
| |
| if (indent >= 2) /* Reduce indent, guarantee minimum 0 */ |
| { |
| indent -= 2; |
| } |
| sprintf(outString, "(end of %s)", label); |
| Show245(tag, indent, outString); |
| #endif |
| } |
| |
| /* --------------------------------------------- */ |
| /* ----------- ARRAYS OF OBJECTS --------------- */ |
| /* --------------------------------------------- */ |
| |
| // ========================================================= |
| // ShowPERIntegers() |
| // |
| // This function displays an int32EGER object which is the |
| // ofitem of a SeqOf or SetOf. It does so via call to |
| // ShowPERInteger(), after constructing a special label. |
| // ========================================================= |
| void ShowPERIntegers(uint16 tag, uint16 indent, const char* label, uint32 value, uint32 number) |
| { |
| OSCL_UNUSED_ARG(tag); |
| OSCL_UNUSED_ARG(indent); |
| OSCL_UNUSED_ARG(label); |
| OSCL_UNUSED_ARG(value); |
| OSCL_UNUSED_ARG(number); |
| #ifdef PVANALYZER //07/12/01wjj |
| uint8 outString[100]; |
| |
| sprintf(outString, "%s[%u]", label, number); |
| ShowPERInteger(tag, indent, outString, value); |
| #endif |
| } |
| |
| // ========================================================= |
| // ShowPEROctetStrings() |
| // |
| // This function displays an OCTET STRING which is the |
| // ofitem of a SeqOf or SetOf. It does so via call to |
| // ShowPEROctetString(), after constructing a special label. |
| // ========================================================= |
| void ShowPEROctetStrings(uint16 tag, uint16 indent, const char* label, PS_OCTETSTRING x, uint32 number) |
| { |
| OSCL_UNUSED_ARG(tag); |
| OSCL_UNUSED_ARG(indent); |
| OSCL_UNUSED_ARG(label); |
| OSCL_UNUSED_ARG(x); |
| OSCL_UNUSED_ARG(number); |
| #ifdef PVANALYZER //07/12/01wjj |
| uint8 outString[100]; |
| |
| sprintf(outString, "%s[%u]", label, number); |
| ShowPEROctetString(tag, indent, outString, x); |
| #endif |
| } |
| |
| // ----------------------------------------------------------- |
| // Dummy PVAnalyzer() Function |
| // --> This may be added to provide the analyzer function if |
| // PVAnalyzer() is not provided at the application layer. |
| // However, the app layer is really where the analyzer |
| // should reside. |
| // --> Note: This requires <stdio.h> and <time.h> to be included. |
| // ----------------------------------------------------------- |
| //#ifdef PVANALYZER |
| //void PVAnalyzer( uint32 tag, Tint8 *pPerDataIn,...) |
| //{ |
| // FILE *pFile; |
| // uint8 *pFileName ="h245per.txt"; |
| // uint8 pTimeBuf[32]; |
| // uint8 *tagString; |
| // |
| // pFile = fopen( pFileName, "a+"); |
| // if( pFile != NULL ) |
| // { |
| // _tzset(); |
| // _strtime( pTimeBuf ); |
| // |
| // if(tag==2) |
| // tagString="PerEnc"; |
| // else if(tag==4) |
| // tagString="PerEnx"; |
| // else if(tag==8) |
| // tagString="PerDec"; |
| // else if(tag==16) |
| // tagString="PerDe"; |
| // else if(tag==32) |
| // tagString=" Se "; |
| // else if(tag==64) |
| // tagString=" Tsc "; |
| // |
| // fprintf( pFile, "<%s> <%s> %s\n", pTimeBuf, tagString, pPerDataIn ); |
| // fclose(pFile); |
| // } /*end if(pFile != NULL) */ |
| //} |
| //#endif |