MEDIACODEC_API MediaPacket_t* ReadNextPacket(MediaFormatContext_t* ctx){ MediaPacket_t* pkt = NULL; while(1){ pkt = AllocPacket(); if( pkt == NULL){ return NULL; } if( av_read_frame((AVFormatContext*)ctx->fc, (AVPacket*)pkt->pkt) <0 ){ FreePacket(pkt,0); //并没有释放内部的packet数据 //printf("read_fream error!\n"); return NULL; } int64_t pts; pts = pkt->pkt->pts; if( pts == 0){ pts = pkt->pkt->dts; } pts *= (ctx->video.tb_num/(ctx->video.tb_den*1.0)); //printf("elapsed time:%d, pts:%d,dts:%d\n",pts,pkt->pkt->pts,pkt->pkt->dts) ; if( ctx->video.videostream == pkt->pkt->stream_index){ pkt->data = pkt->pkt->data; pkt->size = pkt->pkt->size; pkt->stream = pkt->pkt->stream_index; pkt->duration = pts; //pkt->pkt->duration; return pkt; } FreePacket(pkt,1); } return NULL; }
void CLoginIscSocket::SendUserKick( char* accname ) { CPacket* pakout = AllocPacket( ); Packet_Start( pakout, 0x06, 0x414 ); Packet_AddString( pakout, accname ); SendPacket( pakout ); };
void CLoginIscSocket::SendUserConfirmReply( char retcode, int lsid, int csid, unsigned int logintime, unsigned int right, unsigned int payflag, unsigned char chno, char* accname ) { CPacket* pakout = AllocPacket( ); Packet_Start( pakout, 0x20, 0x411 ); Packet_SetByte( pakout, 0, retcode ); Packet_SetDword( pakout, 1, lsid ); Packet_SetDword( pakout, 5, csid ); Packet_SetDword( pakout, 13, logintime ); Packet_SetDword( pakout, 17, right ); Packet_SetDword( pakout, 21, payflag ); Packet_SetByte( pakout, 25, chno ); Packet_AddString( pakout, accname ); SendPacket( pakout ); };
OMXPacket *OMXReader::Read() { assert(!IsEof()); AVPacket pkt; OMXPacket *m_omx_pkt = NULL; int result = -1; if(!m_pFormatContext) return NULL; Lock(); // assume we are not eof if(m_pFormatContext->pb) m_pFormatContext->pb->eof_reached = 0; // keep track if ffmpeg doesn't always set these pkt.size = 0; pkt.data = NULL; pkt.stream_index = MAX_OMX_STREAMS; result = m_dllAvFormat.av_read_frame(m_pFormatContext, &pkt); if (result < 0) { m_eof = true; //FlushRead(); //m_dllAvCodec.av_free_packet(&pkt); UnLock(); return NULL; } else if (pkt.size < 0 || pkt.stream_index >= MAX_OMX_STREAMS) { // XXX, in some cases ffmpeg returns a negative packet size if(m_pFormatContext->pb && !m_pFormatContext->pb->eof_reached) { CLog::Log(LOGERROR, "OMXReader::Read no valid packet"); //FlushRead(); } m_dllAvCodec.av_free_packet(&pkt); m_eof = true; UnLock(); return NULL; } AVStream *pStream = m_pFormatContext->streams[pkt.stream_index]; /* only read packets for active streams */ /* if(!IsActive(pkt.stream_index)) { m_dllAvCodec.av_free_packet(&pkt); UnLock(); return NULL; } */ // lavf sometimes bugs out and gives 0 dts/pts instead of no dts/pts // since this could only happens on initial frame under normal // circomstances, let's assume it is wrong all the time if(pkt.dts == 0) pkt.dts = AV_NOPTS_VALUE; if(pkt.pts == 0) pkt.pts = AV_NOPTS_VALUE; if(m_bMatroska && pStream->codec && pStream->codec->codec_type == AVMEDIA_TYPE_VIDEO) { // matroska can store different timestamps // for different formats, for native stored // stuff it is pts, but for ms compatibility // tracks, it is really dts. sadly ffmpeg // sets these two timestamps equal all the // time, so we select it here instead if(pStream->codec->codec_tag == 0) pkt.dts = AV_NOPTS_VALUE; else pkt.pts = AV_NOPTS_VALUE; } // we need to get duration slightly different for matroska embedded text subtitels if(m_bMatroska && pStream->codec->codec_id == CODEC_ID_TEXT && pkt.convergence_duration != 0) pkt.duration = pkt.convergence_duration; if(m_bAVI && pStream->codec && pStream->codec->codec_type == AVMEDIA_TYPE_VIDEO) { // AVI's always have borked pts, specially if m_pFormatContext->flags includes // AVFMT_FLAG_GENPTS so always use dts pkt.pts = AV_NOPTS_VALUE; } m_omx_pkt = AllocPacket(pkt.size); /* oom error allocation av packet */ if(!m_omx_pkt) { m_eof = true; m_dllAvCodec.av_free_packet(&pkt); UnLock(); return NULL; } m_omx_pkt->codec_type = pStream->codec->codec_type; /* copy content into our own packet */ m_omx_pkt->size = pkt.size; if (pkt.data) memcpy(m_omx_pkt->data, pkt.data, m_omx_pkt->size); m_omx_pkt->stream_index = pkt.stream_index; GetHints(pStream, &m_omx_pkt->hints); //m_omx_pkt->dts = ConvertTimestamp(pkt.dts, pStream->time_base.den, pStream->time_base.num); //m_omx_pkt->pts = ConvertTimestamp(pkt.pts, pStream->time_base.den, pStream->time_base.num); m_omx_pkt->dts = ConvertTimestamp(pkt.dts, &pStream->time_base); m_omx_pkt->pts = ConvertTimestamp(pkt.pts, &pStream->time_base); m_omx_pkt->duration = DVD_SEC_TO_TIME((double)pkt.duration * pStream->time_base.num / pStream->time_base.den); // used to guess streamlength if (m_omx_pkt->dts != DVD_NOPTS_VALUE && (m_omx_pkt->dts > m_iCurrentPts || m_iCurrentPts == DVD_NOPTS_VALUE)) m_iCurrentPts = m_omx_pkt->dts; // check if stream has passed full duration, needed for live streams if(pkt.dts != (int64_t)AV_NOPTS_VALUE) { int64_t duration; duration = pkt.dts; if(pStream->start_time != (int64_t)AV_NOPTS_VALUE) duration -= pStream->start_time; if(duration > pStream->duration) { pStream->duration = duration; duration = m_dllAvUtil.av_rescale_rnd(pStream->duration, (int64_t)pStream->time_base.num * AV_TIME_BASE, pStream->time_base.den, AV_ROUND_NEAR_INF); if ((m_pFormatContext->duration == (int64_t)AV_NOPTS_VALUE) || (m_pFormatContext->duration != (int64_t)AV_NOPTS_VALUE && duration > m_pFormatContext->duration)) m_pFormatContext->duration = duration; } } m_dllAvCodec.av_free_packet(&pkt); UnLock(); return m_omx_pkt; }