static int extract_extradata_mpeg4(AVBSFContext *ctx, AVPacket *pkt, uint8_t **data, int *size) { ExtractExtradataContext *s = ctx->priv_data; const uint8_t *ptr = pkt->data, *end = pkt->data + pkt->size; uint32_t state = UINT32_MAX; while (ptr < end) { ptr = avpriv_find_start_code(ptr, end, &state); if (state == 0x1B3 || state == 0x1B6) { if (ptr - pkt->data > 4) { *size = ptr - 4 - pkt->data; *data = av_malloc(*size + AV_INPUT_BUFFER_PADDING_SIZE); if (!*data) return AVERROR(ENOMEM); memcpy(*data, pkt->data, *size); if (s->remove) { pkt->data += *size; pkt->size -= *size; } } break; } } return 0; }
static int extract_extradata_vc1(AVBSFContext *ctx, AVPacket *pkt, uint8_t **data, int *size) { ExtractExtradataContext *s = ctx->priv_data; const uint8_t *ptr = pkt->data, *end = pkt->data + pkt->size; uint32_t state = UINT32_MAX; int has_extradata = 0, extradata_size = 0; while (ptr < end) { ptr = avpriv_find_start_code(ptr, end, &state); if (state == VC1_CODE_SEQHDR || state == VC1_CODE_ENTRYPOINT) { has_extradata = 1; } else if (has_extradata && IS_MARKER(state)) { extradata_size = ptr - 4 - pkt->data; break; } } if (extradata_size) { *data = av_malloc(extradata_size + AV_INPUT_BUFFER_PADDING_SIZE); if (!*data) return AVERROR(ENOMEM); memcpy(*data, pkt->data, extradata_size); *size = extradata_size; if (s->remove) { pkt->data += extradata_size; pkt->size -= extradata_size; } } return 0; }
/** * Find the end of the current frame in the bitstream. * @return the position of the first byte of the next frame, or -1 */ int ff_mpeg1_find_frame_end(ParseContext *pc, const uint8_t *buf, int buf_size, AVCodecParserContext *s) { int i; uint32_t state = pc->state; /* EOF considered as end of frame */ if (buf_size == 0) return 0; /* 0 frame start -> 1/4 1 first_SEQEXT -> 0/2 2 first field start -> 3/0 3 second_SEQEXT -> 2/0 4 searching end */ for (i = 0; i < buf_size; i++) { av_assert1(pc->frame_start_found >= 0 && pc->frame_start_found <= 4); if (pc->frame_start_found & 1) { if (state == EXT_START_CODE && (buf[i] & 0xF0) != 0x80) pc->frame_start_found--; else if (state == EXT_START_CODE + 2) { if ((buf[i] & 3) == 3) pc->frame_start_found = 0; else pc->frame_start_found = (pc->frame_start_found + 1) & 3; } state++; } else { i = avpriv_find_start_code(buf + i, buf + buf_size, &state) - buf - 1; if (pc->frame_start_found == 0 && state >= SLICE_MIN_START_CODE && state <= SLICE_MAX_START_CODE) { i++; pc->frame_start_found = 4; } if (state == SEQ_END_CODE) { pc->frame_start_found = 0; pc->state=-1; return i+1; } if (pc->frame_start_found == 2 && state == SEQ_START_CODE) pc->frame_start_found = 0; if (pc->frame_start_found < 4 && state == EXT_START_CODE) pc->frame_start_found++; if (pc->frame_start_found == 4 && (state & 0xFFFFFF00) == 0x100) { if (state < SLICE_MIN_START_CODE || state > SLICE_MAX_START_CODE) { pc->frame_start_found = 0; pc->state = -1; return i - 3; } } if (pc->frame_start_found == 0 && s && state == PICTURE_START_CODE) { ff_fetch_timestamp(s, i - 3, 1); } } } pc->state = state; return END_NOT_FOUND; }
int ff_mpeg4video_split(AVCodecContext *avctx, const uint8_t *buf, int buf_size) { uint32_t state = -1; const uint8_t *ptr = buf, *end = buf + buf_size; while (ptr < end) { ptr = avpriv_find_start_code(ptr, end, &state); if (state == 0x1B3 || state == 0x1B6) return ptr - 4 - buf; } return 0; }
static int vc1_split(AVCodecContext *avctx, const uint8_t *buf, int buf_size) { uint32_t state = -1; int charged = 0; const uint8_t *ptr = buf, *end = buf + buf_size; while (ptr < end) { ptr = avpriv_find_start_code(ptr, end, &state); if (state == VC1_CODE_SEQHDR || state == VC1_CODE_ENTRYPOINT) { charged = 1; } else if (charged && IS_MARKER(state)) return ptr - 4 - buf; } return 0; }
const uint8_t* CheckForEndOfSequence(AVCodecID codec, const uint8_t *buf, long len, uint32_t *state) { if (buf && len > 0) { const uint8_t *p = buf, *end = buf + len; if (codec == AV_CODEC_ID_MPEG2VIDEO) { while (p < end) { p = avpriv_find_start_code(p, end, state); if (*state == 0x000001b7) { DbgLog((LOG_TRACE, 50, L"Found SEQ_END_CODE at %p (end: %p)", p, end)); return p; } } } return NULL; } return NULL; }
int CheckForSequenceMarkers(AVCodecID codec, const uint8_t *buf, long len, uint32_t *state, const uint8_t **pos) { int status = 0; if (buf && len > 0) { const uint8_t *p = buf, *end = buf + len; if (codec == AV_CODEC_ID_MPEG2VIDEO) { while (p < end) { p = avpriv_find_start_code(p, end, state); if (*state == 0x000001b7) { DbgLog((LOG_TRACE, 50, L"Found SEQ_END_CODE at %p (end: %p)", p, end)); status |= STATE_EOS_FOUND; if (pos) *pos = p; return status; } else if (*state == 0x000001b8) { status |= STATE_GOP_FOUND; } } } return status; } return status; }