* Decodes a video frame from the specified raw packet data * ('data', 'size'). * The output of this function is stored in 'pv->list', which contains a list * of zero or more decoded packets. */
| 1691 | * of zero or more decoded packets. |
| 1692 | */ |
| 1693 | static int decodeFrame( hb_work_private_t * pv, packet_info_t * packet_info ) |
| 1694 | { |
| 1695 | int got_picture = 0, oldlevel = 0, ret; |
| 1696 | AVPacket *avp = pv->pkt; |
| 1697 | reordered_data_t * reordered; |
| 1698 | AVFrame *recv_frame = pv->frame; |
| 1699 | |
| 1700 | if (pv->hw_frame) |
| 1701 | { |
| 1702 | recv_frame = pv->hw_frame; |
| 1703 | } |
| 1704 | |
| 1705 | if ( global_verbosity_level <= 1 ) |
| 1706 | { |
| 1707 | oldlevel = av_log_get_level(); |
| 1708 | av_log_set_level( AV_LOG_QUIET ); |
| 1709 | } |
| 1710 | |
| 1711 | if (packet_info != NULL) |
| 1712 | { |
| 1713 | avp->data = packet_info->data; |
| 1714 | avp->size = packet_info->size; |
| 1715 | avp->pts = pv->sequence; |
| 1716 | avp->dts = pv->sequence; |
| 1717 | reordered = malloc(sizeof(*reordered)); |
| 1718 | if (reordered != NULL) |
| 1719 | { |
| 1720 | reordered->sequence = pv->sequence++; |
| 1721 | reordered->pts = packet_info->pts; |
| 1722 | reordered->scr_sequence = packet_info->scr_sequence; |
| 1723 | reordered->new_chap = packet_info->new_chap; |
| 1724 | reordered_hash_add(pv, reordered); |
| 1725 | } |
| 1726 | |
| 1727 | // libav avcodec video decoder needs AVPacket flagged with |
| 1728 | // AV_PKT_FLAG_KEY for some codecs. For example, sequence of |
| 1729 | // PNG in a mov container. |
| 1730 | if (packet_info->frametype & HB_FRAME_MASK_KEY) |
| 1731 | { |
| 1732 | avp->flags |= AV_PKT_FLAG_KEY; |
| 1733 | } |
| 1734 | avp->flags |= packet_info->discard * AV_PKT_FLAG_DISCARD; |
| 1735 | } |
| 1736 | else |
| 1737 | { |
| 1738 | avp->data = NULL; |
| 1739 | avp->size = 0; |
| 1740 | } |
| 1741 | |
| 1742 | if (pv->palette != NULL) |
| 1743 | { |
| 1744 | uint8_t * palette; |
| 1745 | int size; |
| 1746 | palette = av_packet_new_side_data(avp, AV_PKT_DATA_PALETTE, |
| 1747 | AVPALETTE_SIZE); |
| 1748 | size = MIN(pv->palette->size, AVPALETTE_SIZE); |
| 1749 | memcpy(palette, pv->palette->data, size); |
| 1750 | hb_buffer_close(&pv->palette); |
no test coverage detected