Example #1
0
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++;
  }
}
Example #2
0
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;
}