int ff_rm_parse_packet (AVFormatContext *s, AVIOContext *pb, AVStream *st, RMStream *ast, int len, AVPacket *pkt, int *seq, int flags, int64_t timestamp) { RMDemuxContext *rm = s->priv_data; if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) { rm->current_stream= st->id; if(rm_assemble_video_frame(s, pb, rm, ast, pkt, len, seq, ×tamp)) return -1; //got partial frame } else if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO) { if ((ast->deint_id == DEINT_ID_GENR) || (ast->deint_id == DEINT_ID_INT4) || (ast->deint_id == DEINT_ID_SIPR)) { int x; int sps = ast->sub_packet_size; int cfs = ast->coded_framesize; int h = ast->sub_packet_h; int y = ast->sub_packet_cnt; int w = ast->audio_framesize; if (flags & 2) y = ast->sub_packet_cnt = 0; if (!y) ast->audiotimestamp = timestamp; switch (ast->deint_id) { case DEINT_ID_INT4: for (x = 0; x < h/2; x++) avio_read(pb, ast->pkt.data+x*2*w+y*cfs, cfs); break; case DEINT_ID_GENR: for (x = 0; x < w/sps; x++) avio_read(pb, ast->pkt.data+sps*(h*x+((h+1)/2)*(y&1)+(y>>1)), sps); break; case DEINT_ID_SIPR: avio_read(pb, ast->pkt.data + y * w, w); break; } if (++(ast->sub_packet_cnt) < h) return -1; if (ast->deint_id == DEINT_ID_SIPR) ff_rm_reorder_sipr_data(ast->pkt.data, h, w); ast->sub_packet_cnt = 0; rm->audio_stream_num = st->index; rm->audio_pkt_cnt = h * w / st->codec->block_align; } else if ((ast->deint_id == DEINT_ID_VBRF) ||
static int Process( ffmpeg_video* p, const packet* Packet, const flowstate* State ) { int Picture; int Len; if (Packet) { if (State->DropLevel) { if (State->DropLevel>1) { p->SkipToKey = 1; p->DropToKey = 1; p->Dropping = 1; p->Context->hurry_up = 5; } else p->Context->hurry_up = 1; if (!SupportDrop(p)) p->Context->hurry_up = 0; } else p->Context->hurry_up = 0; if (!Packet->Key && p->DropToKey) { if (p->Dropping) { flowstate DropState; DropState.CurrTime = TIME_UNKNOWN; DropState.DropLevel = 1; p->Codec.Out.Process(p->Codec.Out.Pin.Node,NULL,&DropState); } if (SupportDrop(p)) avcodec_flush_buffers(p->Context); return ERR_DROPPING; } if (p->DropToKey) p->DropToKey = 0; if (Packet->RefTime >= 0) p->Codec.Packet.RefTime = Packet->RefTime; BufferPack(&p->Buffer,0); if(p->Codec.In.Pin.Node->Class==FOURCC('R','V','_','0')&& (p->Codec.In.Format.Format.Video.Pixel.FourCC == FOURCC('R','V','1','0')|| p->Codec.In.Format.Format.Video.Pixel.FourCC == FOURCC('R','V','2','0')|| p->Codec.In.Format.Format.Video.Pixel.FourCC == FOURCC('R','V','3','0')|| p->Codec.In.Format.Format.Video.Pixel.FourCC == FOURCC('R','V','4','0'))) { int32_t ret = rm_assemble_video_frame(p,Packet); if(ret != ERR_NONE) return ERR_NEED_MORE_DATA; } else { BufferWrite(&p->Buffer,Packet->Data[0],Packet->Length,2048); } } else { if (p->FrameTime<0) p->Codec.Packet.RefTime = TIME_UNKNOWN; else if (!State) p->Codec.Packet.RefTime += p->FrameTime; if (!State && p->Buffer.WritePos == p->Buffer.ReadPos) return ERR_NEED_MORE_DATA; } if (p->SkipToKey) p->Picture->pict_type = 0; Len = avcodec_decode_video(p->Context, p->Picture, &Picture, p->Buffer.Data + p->Buffer.ReadPos, p->Buffer.WritePos - p->Buffer.ReadPos); if (Len < 0) { BufferDrop(&p->Buffer); return ERR_INVALID_DATA; } p->Buffer.ReadPos += Len; if (!Picture) { if (p->SkipToKey>1 && p->Picture->pict_type) --p->SkipToKey; return ERR_NEED_MORE_DATA; } if (p->SkipToKey>0) { if ((!p->Picture->key_frame && p->Picture->pict_type) || p->SkipToKey>1) { if (p->SkipToKey>1) --p->SkipToKey; if (p->Dropping) { flowstate DropState; DropState.CurrTime = TIME_UNKNOWN; DropState.DropLevel = 1; p->Codec.Out.Process(p->Codec.Out.Pin.Node,NULL,&DropState); } return ERR_DROPPING; } p->SkipToKey = 0; } if (p->Context->pix_fmt != p->PixelFormat || p->Context->sample_aspect_ratio.num != p->Aspect.num || p->Context->sample_aspect_ratio.den != p->Aspect.den || p->Context->width != p->Codec.Out.Format.Format.Video.Width || p->Context->height != p->Codec.Out.Format.Format.Video.Height || p->Picture->linesize[0] != p->Codec.Out.Format.Format.Video.Pitch) { if (!BuildOutputFormat(p)) return ERR_INVALID_DATA; ConnectionUpdate(&p->Codec.Node,CODEC_OUTPUT,p->Codec.Out.Pin.Node,p->Codec.Out.Pin.No); } p->Codec.Packet.Data[0] = p->Picture->data[0]; p->Codec.Packet.Data[1] = p->Picture->data[1]; p->Codec.Packet.Data[2] = p->Picture->data[2]; return ERR_NONE; }