/****************************************************************************** * Copyright (c) 2000-2023 Ericsson Telecom AB * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v2.0 * which accompanies this distribution, and is available at * https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.html * * Contributors: * Gabor Szalai - initial implementation and initial documentation * Peter Kremer * Sandor Palugyai * Tibor Harai ******************************************************************************/ // // File: RTP_Media.ttcn // Description: Functions of the media file operations for RTP. // Rev: R5B // Prodnr: CNL 113 392 module RTP_Media { import from RTP_File_Types all; function f_Init_Media_Fileinfo( in charstring pl_filename, in integer pl_block_size, in InitOperType pl_init_type, in RTP_MediaType pl_media_type, in integer pl_blockno, in integer pl_nof_blocks, inout RTP_FileInfo pl_fileinfo ) { pl_fileinfo.fd := f_INIT_CODEC(pl_filename, pl_block_size, pl_init_type); pl_fileinfo.block_size := pl_block_size; pl_fileinfo.block_no := pl_blockno; pl_fileinfo.nof_blocks_to_read := pl_nof_blocks; pl_fileinfo.mediaType := pl_media_type; select (pl_media_type) { case (JPEG) { pl_fileinfo.headerOp := true; // 16: size in byte of the JPEG_RTP_Header type pl_fileinfo.headerOffset := 16; pl_fileinfo.mediaHeader.jpeg_rtp_hdr := {{0,0,0,0,0,0},{0,'0'B,'0'B,0},{0,0,0,{0}}}; } case (H263) { pl_fileinfo.headerOp := true; // size in byte of the H263_RTP_Header type pl_fileinfo.headerOffset := 4; pl_fileinfo.mediaHeader.h263_rtp_hdr := {'0'B,'0'B,'000'B,'000'B, '000'B,'0'B,'0'B,'0'B,'0'B, '0000'B,'00'B,'000'B, '00000000'B}; } case (MPEG4, GIF, f3GP, fMPEG4) { pl_fileinfo.headerOp := false; pl_fileinfo.headerOffset := 0; pl_fileinfo.mediaHeader.file_rtp_hdr := ''O; } case else { log("ERROR: Wrong media type setting!"); setverdict(fail); stop; } } } function f_Get_Media_Content( inout RTP_FileInfo pl_fileinfo ) return octetstring { var octetstring retval; select (pl_fileinfo.mediaType) { case (JPEG) { if (pl_fileinfo.headerOp) { f_Count_JPEG_Header_Offset(pl_fileinfo); var octetstring vl_block := f_GET_CONTENT(pl_fileinfo.fd, 0, 0, pl_fileinfo.headerOffset); pl_fileinfo.mediaHeader.jpeg_rtp_hdr := f_JPEG_RTP_Hdr_dec( vl_block ); pl_fileinfo.mediaHeader.jpeg_rtp_hdr.main.fragment_offset := pl_fileinfo.headerOffset; pl_fileinfo.headerOp := false; } var JPEG_RTP vl_RTP_data; vl_RTP_data.data := f_GET_CONTENT(pl_fileinfo.fd, pl_fileinfo.block_no, pl_fileinfo.nof_blocks_to_read, pl_fileinfo.headerOffset); pl_fileinfo.mediaHeader.jpeg_rtp_hdr.main.fragment_offset := pl_fileinfo.mediaHeader.jpeg_rtp_hdr.main.fragment_offset + lengthof(vl_RTP_data.data); vl_RTP_data.jpeg_rtp_hdr := pl_fileinfo.mediaHeader.jpeg_rtp_hdr; var Media_RTP_Data vl_Data := { jpeg_rtp := vl_RTP_data }; retval := f_RTP_Data_enc(vl_Data); } case (H263) { if (pl_fileinfo.headerOp) { var octetstring vl_hdr:=f_GET_CONTENT(pl_fileinfo.fd,0,0,pl_fileinfo.headerOffset); pl_fileinfo.mediaHeader.h263_rtp_hdr := f_H263_RTP_Hdr_dec( vl_hdr ); pl_fileinfo.headerOp := false; } var H263_RTP vl_RTP_data; vl_RTP_data.data := f_GET_CONTENT(pl_fileinfo.fd, pl_fileinfo.block_no, pl_fileinfo.nof_blocks_to_read, pl_fileinfo.headerOffset); vl_RTP_data.h263_rtp_hdr := pl_fileinfo.mediaHeader.h263_rtp_hdr; var Media_RTP_Data vl_Data := { h263_rtp := vl_RTP_data }; retval := f_RTP_Data_enc(vl_Data); } case (MPEG4, GIF, f3GP, fMPEG4) { retval := f_GET_CONTENT(pl_fileinfo.fd, pl_fileinfo.block_no, pl_fileinfo.nof_blocks_to_read, pl_fileinfo.headerOffset); } case else { log("ERROR: Wrong media type setting!"); setverdict(fail); stop; } } return retval; } function f_Put_Media_Content(in RTP_FileInfo pl_fileinfo, in octetstring data) return integer { select (pl_fileinfo.mediaType) { case (JPEG) { var JPEG_RTP vl_RTP_data := f_JPEG_RTP_Data_dec(data); if (pl_fileinfo.headerOp) { var Media_RTP_Header vl_mrh := {jpeg_rtp_hdr := vl_RTP_data.jpeg_rtp_hdr}; // the fragment offset let be always zero in the file vl_mrh.jpeg_rtp_hdr.main.fragment_offset := 0; pl_fileinfo.headerOffset := f_PUT_CONTENT(pl_fileinfo.fd,0,f_RTP_Hdr_enc(vl_mrh),0); pl_fileinfo.headerOp := false; } if (f_PUT_CONTENT(pl_fileinfo.fd,pl_fileinfo.block_no,vl_RTP_data.data,pl_fileinfo.headerOffset) < pl_fileinfo.nof_blocks_to_read*pl_fileinfo.block_size) { return 0; } } case (H263) { var H263_RTP vl_RTP_data := f_H263_RTP_Data_dec(data); if (pl_fileinfo.headerOp) { var Media_RTP_Header vl_mrh := {h263_rtp_hdr := vl_RTP_data.h263_rtp_hdr}; pl_fileinfo.headerOffset := f_PUT_CONTENT(pl_fileinfo.fd,0,f_RTP_Hdr_enc(vl_mrh),0); pl_fileinfo.headerOp := false; } if (f_PUT_CONTENT(pl_fileinfo.fd,pl_fileinfo.block_no,vl_RTP_data.data,pl_fileinfo.headerOffset) < pl_fileinfo.nof_blocks_to_read*pl_fileinfo.block_size) { return 0; } } case (MPEG4, GIF, f3GP, fMPEG4) { if (f_PUT_CONTENT(pl_fileinfo.fd, pl_fileinfo.block_no, data, pl_fileinfo.headerOffset) < pl_fileinfo.nof_blocks_to_read*pl_fileinfo.block_size) { return 0; } } case else { log("ERROR: Wrong media type setting!"); setverdict(fail); stop; } } return 1; } }