View Single Post
  #1  
Old 04-24-2013, 12:31 AM
tigershi2000 tigershi2000 is offline
Junior Member
 
Join Date: Apr 2013
Posts: 1
tigershi2000 is on a distinguished road
Default

librtmp RTMP_Read is block, can unblock


debug librtmp:

RTMP_Read-->Read_1_Packet-->RTMP_GetNextMediaPacket
while (!bHasMediaPacket && RTMP_IsConnected(r)
&& RTMP_ReadPacket(r, packet))
{
...
bHasMediaPacket = RTMP_ClientPacket(r, packet);


if (!bHasMediaPacket)
{
RTMPPacket_Free(packet);
}

...
}

there are be block。

can use callback do noblock:


rtmp.h:

typedef struct AVIOInterruptCB {
int (*callback)(void*);
void *opaque;
} AVIOInterruptCB;

typedef struct RTMP
{
...
AVIOInterruptCB interrupt_callback;
...
}

RTMP_Init:
{..
r->interrupt_callback.opaque = NULL;
r->interrupt_callback.callback = NULL;
}



outside use librtmp:
static int decode_interrupt_cb(void *ctx)
{
MYClass *is = (MYClass *)ctx;
return is->abort_request;
}

RTMP* r;
RTMP_Init(r);
r->interrupt_callback.callback = decode_interrupt_cb;
r->interrupt_callback.opaque = this;


if abort_request is true, RTMP_GetNextMediaPacket() break, RTMP_Read is break, can safe exit my application.



I hope it can help you。
Reply With Quote