[Asterisk-video] several questions to source code of app_h324m
Sergio Garcia
sergio.garcia at fontventa.com
Thu Jul 26 07:38:06 CDT 2007
---------- Original Message ----------------------------------
From: Klaus Darilion <klaus.mailinglists at pernau.at>
Reply-To: Development discussion of video media support in Asterisk<asterisk-video at lists.digium.com>
Date: Wed, 25 Jul 2007 16:10:32 +0200
>Hi Sergio!
>
>I'm reading the code to find out why some things don't work for me. Can
>you please comment on my questions?
>
>
>static struct ast_frame* create_ast_frame(void *frame, struct video_tr *vtr)
>{
> int mark = 0;
> struct ast_frame* send;
>
> /* Get data & size */
> unsigned char * framedata = FrameGetData(frame);
> unsigned int framelength = FrameGetLength(frame);
>
> /* Depending on the type */
> switch(FrameGetType(frame))
> {
> case MEDIA_AUDIO:
> /*Check it's AMR */
> if (FrameGetCodec(frame)!=CODEC_AMR)
> /* exit */
> return NULL;
> /* Create frame */
> send = (struct ast_frame *) malloc(sizeof(struct ast_frame) +
>AST_FRIENDLY_OFFSET + framelength + 2);
>
>If I Understand Correctly (IIUC) you allocate the frame structure AND
>the buffer for the data with one malloc. Thus, the frist part of the
>allocated memory is the structure, followed by the data buffer?
>
> /* Set data*/
> send->data = (void*)send + AST_FRIENDLY_OFFSET;
>
>I think this is wrong - it overwrites the structure.
>send->data = (void*)send + sizeof(struct ast_frame) +
> AST_FRIENDLY_OFFSET;
Ups you-'re rigth
>
> send->datalen = framelength;
> /* Set header cmr */
> ((unsigned char*)(send->data))[0] = 0xF0;
> /* Set mode */
> ((unsigned char*)(send->data))[1] = (framedata[0] & 0x78) | 0x04;
>
>
>Here you set the Codec Mode Request 2 times? You set the byte 0 to 0xF0
>(what is that - is that something standardized or just a proprietary
>method for signaling something?).
>
>Then you reset the bits 7,2,1,0 and then you set the bit 2. What for? I
>though the topmost 4 bits (7,6,5,4) are relevant for the codec mode?
>
> /* Copy */
> memcpy(send->data+2, framedata, framelength);
>
>Although the cmr is already copy to framedata[1], it will be copied
>(with the original value) to framedata[2] too. Why?
What you receive in the framedata is the amr if2 frame, you have to add
a 2 byte header for rtp transmision. The problem is that I don't have any
softphone client with amr support to test it.. :(
See http://www.ietf.org/rfc/rfc3267.txt
Chapter 4.4.1. The Payload Header
>
> /* Set video type */
> send->frametype = AST_FRAME_VOICE;
> /* Set codec value */
> send->subclass = AST_FORMAT_AMRNB;
> /* Rest of values*/
> send->src = "h324m";
>wouldn't it be nicer to define "h324m" as global variable?
Ok.
>
> send->samples = 160;
> send->delivery.tv_usec = 0;
> send->delivery.tv_sec = 0;
> send->mallocd = 0;
>IIUC setting mallocd=0 works as the data buffer is allocated together
>with the frame structure. Thus it will be freed when to frame structure
>is freed.
I'll have to check that, probably it's wrong also.
Best regards
Sergio
More information about the asterisk-video
mailing list