memcpy(avctx->extradata, pkt->data, avctx->extradata_size);
memset(avctx->extradata + i, 0, FF_INPUT_BUFFER_PADDING_SIZE);
} else {
- av_free_packet(pkt);
+ av_packet_unref(pkt);
continue;
}
pkt->data, pkt->size, pkt->flags & AV_PKT_FLAG_KEY);
if (ret < 0 ||!outbuf_size) {
- av_free_packet(pkt);
+ av_packet_unref(pkt);
continue;
}
if (outbuf && outbuf != pkt->data) {
}
if (mDefersToCreateAudioTrack) {
if (avctx->extradata_size <= 0) {
- av_free_packet(pkt);
+ av_packet_unref(pkt);
continue;
}
stream_component_open(mAudioStreamIdx);
} else if (pkt->stream_index == mVideoStreamIdx) {
packet_queue_put(&mVideoQ, pkt);
} else {
- av_free_packet(pkt);
+ av_packet_unref(pkt);
}
}
int64_t timeUs = AV_NOPTS_VALUE;
int key = 0;
status_t status = OK;
+ int max_negative_time_frame = 100;
int64_t startTimeUs = mStream->start_time == AV_NOPTS_VALUE ? 0 :
av_rescale_q(mStream->start_time, mStream->time_base, AV_TIME_BASE_Q);
if (seeking) {
if (pkt.data != mQueue->flush_pkt.data) {
- av_free_packet(&pkt);
+ av_packet_unref(&pkt);
goto retry;
} else {
seeking = false;
if (pkt.data == mQueue->flush_pkt.data) {
ALOGV("read %s flush pkt", av_get_media_type_string(mMediaType));
- av_free_packet(&pkt);
+ av_packet_unref(&pkt);
mFirstKeyPktTimestamp = AV_NOPTS_VALUE;
goto retry;
} else if (pkt.data == NULL && pkt.size == 0) {
ALOGD("read %s eos pkt", av_get_media_type_string(mMediaType));
- av_free_packet(&pkt);
+ av_packet_unref(&pkt);
mExtractor->reachedEOS(mMediaType);
return ERROR_END_OF_STREAM;
}
if (waitKeyPkt) {
if (!key) {
ALOGV("drop the non-key packet");
- av_free_packet(&pkt);
+ av_packet_unref(&pkt);
goto retry;
} else {
ALOGV("~~~~~~ got the key packet");
//copy data
if ((mIsAVC || mIsHEVC) && mNal2AnnexB) {
/* This only works for NAL sizes 3-4 */
- CHECK(mNALLengthSize == 3 || mNALLengthSize == 4);
+ if ((mNALLengthSize != 3) && (mNALLengthSize != 4)) {
+ ALOGE("cannot use convertNal2AnnexB, nal size: %d", mNALLengthSize);
+ mediaBuffer->release();
+ mediaBuffer = NULL;
+ av_packet_unref(&pkt);
+ return ERROR_MALFORMED;
+ }
uint8_t *dst = (uint8_t *)mediaBuffer->data();
/* Convert H.264 NAL format to annex b */
ALOGE("convertNal2AnnexB failed");
mediaBuffer->release();
mediaBuffer = NULL;
- av_free_packet(&pkt);
+ av_packet_unref(&pkt);
return ERROR_MALFORMED;
}
} else {
, timeUs, startTimeUs, pkt.dts, pkt.pts);
mediaBuffer->release();
mediaBuffer = NULL;
- av_free_packet(&pkt);
- return ERROR_MALFORMED;
+ av_packet_unref(&pkt);
+ if (max_negative_time_frame-- > 0) {
+ goto retry;
+ } else {
+ ALOGE("too many negative timestamp packets, abort decoding");
+ return ERROR_MALFORMED;
+ }
}
// predict the next PTS to use for exact-frame seek below
*buffer = mediaBuffer;
- av_free_packet(&pkt);
+ av_packet_unref(&pkt);
return OK;
}
// This is a heavyweight sniffer, don't invoke it if Stagefright knows
// what it is doing already.
if (mimeType != NULL && confidence != NULL) {
+ if (*mimeType == "application/ogg") {
+ return false;
+ }
if (*confidence > 0.8f) {
return false;
}