Example #1
0
static void
dvd_video_push(dvd_player_t *dp)
{
  media_buf_t *mb;
  media_codec_t *cw = dp->dp_video;
  media_pipe_t *mp = dp->dp_mp;

  if(cw == NULL)
    return;

  mb = media_buf_alloc();
  mb->mb_cw = media_codec_ref(cw);
  mb->mb_size = 0;
  mb->mb_data = NULL;
  mb->mb_aspect_override = dp->dp_aspect_override;
  mb->mb_disable_deinterlacer = 1;
  mb->mb_data_type = MB_VIDEO;
  mb->mb_duration = cw->codec_ctx->ticks_per_frame * 
    1000000LL * av_q2d(cw->codec_ctx->time_base);
  mb->mb_pts = AV_NOPTS_VALUE;
  mb->mb_dts = AV_NOPTS_VALUE;
  mb->mb_epoch = dp->dp_epoch;

  mb_enqueue_always(mp, &mp->mp_video, mb);
}
Example #2
0
static event_t *
get_packet_v(rtmp_t *r, uint8_t *data, size_t size, int64_t dts,
	     media_pipe_t *mp)
{
  uint8_t flags;
  uint8_t type = 0;
  enum CodecID id;
  int d = 0;
  event_t *e;

  if(r->r->m_read.flags & RTMP_READ_SEEKING)
    return NULL; 

  if(size < 2)
    return NULL;

  flags = *data++;
  size--;


  switch(flags & 0xf) {
  case 7:
    type = *data++;
    size--;
    id = CODEC_ID_H264;

    if(size < 3)
      return NULL;
    
    d = (AMF_DecodeInt24((char *)data) + 0xff800000) ^ 0xff800000;
    data += 3;
    size -= 3;
    break;

  case 4:
    type = *data++;
    size--;
    id = CODEC_ID_VP6F;
    break;
  default:
    return NULL;
  }

  if(r->vcodec == NULL) {
    AVCodecContext *ctx;
    media_codec_params_t mcp = {0};

    switch(id) {
    case CODEC_ID_H264:
      if(type != 0 || size < 0)
	return NULL;
	
      ctx = avcodec_alloc_context();
      ctx->extradata = av_mallocz(size + FF_INPUT_BUFFER_PADDING_SIZE);
      memcpy(ctx->extradata, data, size);
      ctx->extradata_size =  size;
      break;

    case CODEC_ID_VP6F:
      if(size < 1)
	return NULL;

      ctx = avcodec_alloc_context();
      ctx->extradata = av_mallocz(1 + FF_INPUT_BUFFER_PADDING_SIZE);
      memcpy(ctx->extradata, &type, 1);
      ctx->extradata_size =  1;
      break;

    default:
      abort();
    }
    mcp.width = r->width;
    mcp.height = r->height;
    r->vcodec = media_codec_create(id, 0, NULL, ctx, &mcp, mp);
    return NULL;
  }


  int skip = 0;

  int64_t pts = 1000LL * (dts + d);
  dts = 1000LL * dts;

  if(d < 0 || dts < r->seekpos) {
    skip = 1;
    r->in_seek_skip = 1;
  } else if(r->in_seek_skip) {
    skip = 2;
    r->in_seek_skip = 0;
  }

  r->lastdts = dts;

  e = sendpkt(r, &r->mp->mp_video, r->vcodec, dts, pts, AV_NOPTS_VALUE,
	      data, size, skip, MB_VIDEO, r->vframeduration);
  if(e != NULL)
    return e;

  if(pts > r->lastsubpts)
    r->lastsubpts = r->subpts = pts;
  else
    r->subpts = AV_NOPTS_VALUE;
  
  if(r->subpts != AV_NOPTS_VALUE && r->sub != NULL) {
    subtitle_entry_t *se = subtitles_pick(r->sub, r->subpts);
    if(se != NULL)
      mb_enqueue_always(mp, &r->mp->mp_video, subtitles_make_pkt(se));
  }
  return NULL;
}