Bool ts_encode_video_frame(GF_AbstractTSMuxer * ts, AVFrame * encodedFrame, uint8_t * data, int encoded, AVCodecContext * videoCodecContext) { if ( ts->muxer ) { // currentFrameTimeProcessed / 1000; // ts->videoCurrentTSPacket.dts = videoCodecContext->coded_frame->coded_picture_number; ts->videoCurrentTSPacket.cts = videoCodecContext->coded_frame->display_picture_number; //avr->videoCurrentTSPacket.dts = avr->videoCurrentTSPacket.cts = sysclock; //ts->videoCurrentTSPacket.dts = ts->videoCurrentTSPacket.cts = currentFrameTimeProcessed; ts->videoCurrentTSPacket.dts = ts->videoCurrentTSPacket.cts = gf_m2ts_get_sys_clock(ts->muxer); ts->videoCurrentTSPacket.data = data; ts->videoCurrentTSPacket.data_len = encoded; ts->videoCurrentTSPacket.flags = GF_ESI_DATA_HAS_CTS | GF_ESI_DATA_HAS_DTS; //if (ts_packets_sent == 0) { ts->videoCurrentTSPacket.flags|=GF_ESI_DATA_AU_START|GF_ESI_DATA_AU_END ; //} void_input_ctrl(ts->video, GF_ESI_INPUT_DATA_PULL, NULL); sendTSMux(ts); } return 0; }
/** * This thread sends the TS packets over the network * \param Parameter The GF_AVRedirect pointer */ static Bool ts_thread_run(void *param) { GF_Err e; GF_AVRedirect * avr = (GF_AVRedirect*) param; assert( avr ); gf_mx_p(avr->tsMutex); while (!avr->frameTimeEncoded && avr->is_running) { gf_mx_v(avr->tsMutex); gf_sleep(1); gf_mx_p(avr->tsMutex); } printf("avr->frameTimeEncoded="LLU"\n", avr->frameTimeEncoded); while (avr->is_running) { e = sendTSMux(avr); gf_mx_v(avr->tsMutex); gf_mx_p(avr->tsMutex); } gf_mx_v(avr->tsMutex); return 0; }