comparison utils.c @ 9355:54bc8a2727b0 libavcodec

Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an AVPacket argument rather than a const uint8_t *buf + int buf_size. This allows passing of packet-specific flags from demuxer to decoder, such as the keyframe flag, which appears necessary to playback corePNG P-frames. Patch by Thilo Borgmann thilo.borgmann googlemail com, see also the thread "Google Summer of Code participation" on the mailinglist.
author rbultje
date Tue, 07 Apr 2009 15:59:50 +0000
parents 6a1ad1d933cd
children d31c367da415
comparison
equal deleted inserted replaced
9354:174309386512 9355:54bc8a2727b0
522 ret = avctx->codec->encode(avctx, buf, buf_size, sub); 522 ret = avctx->codec->encode(avctx, buf, buf_size, sub);
523 avctx->frame_number++; 523 avctx->frame_number++;
524 return ret; 524 return ret;
525 } 525 }
526 526
527 #if LIBAVCODEC_VERSION_MAJOR < 53
527 int attribute_align_arg avcodec_decode_video(AVCodecContext *avctx, AVFrame *picture, 528 int attribute_align_arg avcodec_decode_video(AVCodecContext *avctx, AVFrame *picture,
528 int *got_picture_ptr, 529 int *got_picture_ptr,
529 const uint8_t *buf, int buf_size) 530 const uint8_t *buf, int buf_size)
530 { 531 {
532 AVPacket avpkt;
533 av_init_packet(&avpkt);
534 avpkt.data = buf;
535 avpkt.size = buf_size;
536
537 return avcodec_decode_video2(avctx, picture, got_picture_ptr, &avpkt);
538 }
539 #endif
540
541 int attribute_align_arg avcodec_decode_video2(AVCodecContext *avctx, AVFrame *picture,
542 int *got_picture_ptr,
543 AVPacket *avpkt)
544 {
531 int ret; 545 int ret;
532 546
533 *got_picture_ptr= 0; 547 *got_picture_ptr= 0;
534 if((avctx->coded_width||avctx->coded_height) && avcodec_check_dimensions(avctx,avctx->coded_width,avctx->coded_height)) 548 if((avctx->coded_width||avctx->coded_height) && avcodec_check_dimensions(avctx,avctx->coded_width,avctx->coded_height))
535 return -1; 549 return -1;
536 if((avctx->codec->capabilities & CODEC_CAP_DELAY) || buf_size){ 550 if((avctx->codec->capabilities & CODEC_CAP_DELAY) || avpkt->size){
537 ret = avctx->codec->decode(avctx, picture, got_picture_ptr, 551 ret = avctx->codec->decode(avctx, picture, got_picture_ptr,
538 buf, buf_size); 552 avpkt);
539 553
540 emms_c(); //needed to avoid an emms_c() call before every return; 554 emms_c(); //needed to avoid an emms_c() call before every return;
541 555
542 if (*got_picture_ptr) 556 if (*got_picture_ptr)
543 avctx->frame_number++; 557 avctx->frame_number++;
545 ret= 0; 559 ret= 0;
546 560
547 return ret; 561 return ret;
548 } 562 }
549 563
564 #if LIBAVCODEC_VERSION_MAJOR < 53
550 int attribute_align_arg avcodec_decode_audio2(AVCodecContext *avctx, int16_t *samples, 565 int attribute_align_arg avcodec_decode_audio2(AVCodecContext *avctx, int16_t *samples,
551 int *frame_size_ptr, 566 int *frame_size_ptr,
552 const uint8_t *buf, int buf_size) 567 const uint8_t *buf, int buf_size)
553 { 568 {
569 AVPacket avpkt;
570 av_init_packet(&avpkt);
571 avpkt.data = buf;
572 avpkt.size = buf_size;
573
574 return avcodec_decode_audio3(avctx, samples, frame_size_ptr, &avpkt);
575 }
576 #endif
577
578 int attribute_align_arg avcodec_decode_audio3(AVCodecContext *avctx, int16_t *samples,
579 int *frame_size_ptr,
580 AVPacket *avpkt)
581 {
554 int ret; 582 int ret;
555 583
556 if((avctx->codec->capabilities & CODEC_CAP_DELAY) || buf_size){ 584 if((avctx->codec->capabilities & CODEC_CAP_DELAY) || avpkt->size){
557 //FIXME remove the check below _after_ ensuring that all audio check that the available space is enough 585 //FIXME remove the check below _after_ ensuring that all audio check that the available space is enough
558 if(*frame_size_ptr < AVCODEC_MAX_AUDIO_FRAME_SIZE){ 586 if(*frame_size_ptr < AVCODEC_MAX_AUDIO_FRAME_SIZE){
559 av_log(avctx, AV_LOG_ERROR, "buffer smaller than AVCODEC_MAX_AUDIO_FRAME_SIZE\n"); 587 av_log(avctx, AV_LOG_ERROR, "buffer smaller than AVCODEC_MAX_AUDIO_FRAME_SIZE\n");
560 return -1; 588 return -1;
561 } 589 }
563 *frame_size_ptr < avctx->channels * avctx->frame_size * sizeof(int16_t)){ 591 *frame_size_ptr < avctx->channels * avctx->frame_size * sizeof(int16_t)){
564 av_log(avctx, AV_LOG_ERROR, "buffer %d too small\n", *frame_size_ptr); 592 av_log(avctx, AV_LOG_ERROR, "buffer %d too small\n", *frame_size_ptr);
565 return -1; 593 return -1;
566 } 594 }
567 595
568 ret = avctx->codec->decode(avctx, samples, frame_size_ptr, 596 ret = avctx->codec->decode(avctx, samples, frame_size_ptr, avpkt);
569 buf, buf_size);
570 avctx->frame_number++; 597 avctx->frame_number++;
571 }else{ 598 }else{
572 ret= 0; 599 ret= 0;
573 *frame_size_ptr=0; 600 *frame_size_ptr=0;
574 } 601 }
575 return ret; 602 return ret;
576 } 603 }
577 604
605 #if LIBAVCODEC_VERSION_MAJOR < 53
578 int avcodec_decode_subtitle(AVCodecContext *avctx, AVSubtitle *sub, 606 int avcodec_decode_subtitle(AVCodecContext *avctx, AVSubtitle *sub,
579 int *got_sub_ptr, 607 int *got_sub_ptr,
580 const uint8_t *buf, int buf_size) 608 const uint8_t *buf, int buf_size)
581 { 609 {
610 AVPacket avpkt;
611 av_init_packet(&avpkt);
612 avpkt.data = buf;
613 avpkt.size = buf_size;
614
615 return avcodec_decode_subtitle2(avctx, sub, got_sub_ptr, &avpkt);
616 }
617 #endif
618
619 int avcodec_decode_subtitle2(AVCodecContext *avctx, AVSubtitle *sub,
620 int *got_sub_ptr,
621 AVPacket *avpkt)
622 {
582 int ret; 623 int ret;
583 624
584 *got_sub_ptr = 0; 625 *got_sub_ptr = 0;
585 ret = avctx->codec->decode(avctx, sub, got_sub_ptr, 626 ret = avctx->codec->decode(avctx, sub, got_sub_ptr, avpkt);
586 buf, buf_size);
587 if (*got_sub_ptr) 627 if (*got_sub_ptr)
588 avctx->frame_number++; 628 avctx->frame_number++;
589 return ret; 629 return ret;
590 } 630 }
591 631