void main_loop(void) { const char *s[] = { "001.jpg", "002.jpg", 0, "003.jpg", "004.jpg", "005.jpg", "006.jpg", "007.jpg", "008.jpg", "009.jpg", "010.jpg", "011.jpg", "012.jpg", 0 }; char **p = (char**)s; unsigned short fseq = 1; while (*p) { unsigned short seq; unsigned short client_fseq; load_buff_pool(p_bp, *p); p_bp->f.fseq = fseq; /* send filename, send chunks, send EOF */ do { push_fileinfo(p_bp); } while (CPAPP_IOF != wait_ack(10, &client_fseq)); for (unsigned int i = 0; i <= p_bp->f.filesize / CPAPP_MAX_CHUNKSIZE; i++) { push_chunk(p_bp, i); } push_eof(p_bp); while (((seq = wait_ack(10, &client_fseq)) != CPAPP_EOF) || (client_fseq != fseq)) { // printf("ACK LOOP: ack, cliseq, seq = %04x, %04x, %04x\n", seq, client_fseq, fseq); switch (seq) { case CPAPP_TMO: push_eof(p_bp); break; case CPAPP_IGN: break; case CPAPP_EOF: break; case CPAPP_IOF: break; default: push_chunk(p_bp, seq); break; } } printf("Step to next file. (%d finished)\n", client_fseq); p++; fseq++; } }
void *decoder_thread(void *arg) { PlayerCtx *ctx = arg; AVPacket packet; AVPacket cpacket; size_t decoded_bytes; int seekid = ctx->cur_seekid; printf("Decoder thread started\n"); memset(&packet, 0, sizeof(packet)); memset(&cpacket, 0, sizeof(cpacket)); while (!ctx->exit) { int new_packet = 0; if (cpacket.size == 0) { if (packet.data) av_free_packet(&packet); pthread_mutex_lock(&ctx->seek_mutex); if (ctx->cur_seekid > seekid) { printf("Seek! %f\n", ctx->seek_pos); av_seek_frame(ctx->fmt_ctx, -1, (int64_t)(ctx->seek_pos * AV_TIME_BASE), 0); seekid = ctx->cur_seekid; // HACK! Avoid deadlock by waking up the video waiter pthread_mutex_lock(&ctx->v_buf_mutex); pthread_cond_signal(&ctx->v_buf_not_empty); pthread_mutex_unlock(&ctx->v_buf_mutex); if (ctx->audio_idx != -1) avcodec_flush_buffers(ctx->a_codec_ctx); avcodec_flush_buffers(ctx->v_codec_ctx); } if (av_read_frame(ctx->fmt_ctx, &packet) < 0) { fprintf(stderr, "EOF!\n"); push_eof(ctx, seekid); pthread_cond_wait(&ctx->seek_cond, &ctx->seek_mutex); pthread_mutex_unlock(&ctx->seek_mutex); continue; } pthread_mutex_unlock(&ctx->seek_mutex); cpacket = packet; new_packet = 1; } if (ctx->audio_idx != -1 && cpacket.stream_index == ctx->audio_idx) { decoded_bytes = decode_audio(ctx, &cpacket, new_packet, seekid); } else if (cpacket.stream_index == ctx->video_idx) { decoded_bytes = decode_video(ctx, &cpacket, new_packet, seekid); } else { decoded_bytes = cpacket.size; } cpacket.data += decoded_bytes; cpacket.size -= decoded_bytes; } return NULL; }