mirror of
				https://github.com/nyanmisaka/ffmpeg-rockchip.git
				synced 2025-11-01 04:53:04 +08:00 
			
		
		
		
	avcodec/packet: move AVPacketList definition and function helpers over from libavformat
And replace the flags parameter with a function callback that can be used to copy the contents of the packet (e.g, av_packet_ref and av_packet_copy_props). Signed-off-by: James Almer <jamrial@gmail.com>
This commit is contained in:
		| @@ -726,6 +726,73 @@ FF_ENABLE_DEPRECATION_WARNINGS | |||||||
| #endif | #endif | ||||||
| } | } | ||||||
|  |  | ||||||
|  | int avpriv_packet_list_put(AVPacketList **packet_buffer, | ||||||
|  |                            AVPacketList **plast_pktl, | ||||||
|  |                            AVPacket      *pkt, | ||||||
|  |                            int (*copy)(AVPacket *dst, const AVPacket *src), | ||||||
|  |                            int flags) | ||||||
|  | { | ||||||
|  |     AVPacketList *pktl = av_mallocz(sizeof(AVPacketList)); | ||||||
|  |     int ret; | ||||||
|  |  | ||||||
|  |     if (!pktl) | ||||||
|  |         return AVERROR(ENOMEM); | ||||||
|  |  | ||||||
|  |     if (copy) { | ||||||
|  |         ret = copy(&pktl->pkt, pkt); | ||||||
|  |         if (ret < 0) { | ||||||
|  |             av_free(pktl); | ||||||
|  |             return ret; | ||||||
|  |         } | ||||||
|  |     } else { | ||||||
|  |         ret = av_packet_make_refcounted(pkt); | ||||||
|  |         if (ret < 0) { | ||||||
|  |             av_free(pktl); | ||||||
|  |             return ret; | ||||||
|  |         } | ||||||
|  |         av_packet_move_ref(&pktl->pkt, pkt); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     if (*packet_buffer) | ||||||
|  |         (*plast_pktl)->next = pktl; | ||||||
|  |     else | ||||||
|  |         *packet_buffer = pktl; | ||||||
|  |  | ||||||
|  |     /* Add the packet in the buffered packet list. */ | ||||||
|  |     *plast_pktl = pktl; | ||||||
|  |     return 0; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | int avpriv_packet_list_get(AVPacketList **pkt_buffer, | ||||||
|  |                            AVPacketList **pkt_buffer_end, | ||||||
|  |                            AVPacket      *pkt) | ||||||
|  | { | ||||||
|  |     AVPacketList *pktl; | ||||||
|  |     if (!*pkt_buffer) | ||||||
|  |         return AVERROR(EAGAIN); | ||||||
|  |     pktl        = *pkt_buffer; | ||||||
|  |     *pkt        = pktl->pkt; | ||||||
|  |     *pkt_buffer = pktl->next; | ||||||
|  |     if (!pktl->next) | ||||||
|  |         *pkt_buffer_end = NULL; | ||||||
|  |     av_freep(&pktl); | ||||||
|  |     return 0; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | void avpriv_packet_list_free(AVPacketList **pkt_buf, AVPacketList **pkt_buf_end) | ||||||
|  | { | ||||||
|  |     AVPacketList *tmp = *pkt_buf; | ||||||
|  |  | ||||||
|  |     while (tmp) { | ||||||
|  |         AVPacketList *pktl = tmp; | ||||||
|  |         tmp = pktl->next; | ||||||
|  |         av_packet_unref(&pktl->pkt); | ||||||
|  |         av_freep(&pktl); | ||||||
|  |     } | ||||||
|  |     *pkt_buf     = NULL; | ||||||
|  |     *pkt_buf_end = NULL; | ||||||
|  | } | ||||||
|  |  | ||||||
| int ff_side_data_set_encoder_stats(AVPacket *pkt, int quality, int64_t *error, int error_count, int pict_type) | int ff_side_data_set_encoder_stats(AVPacket *pkt, int quality, int64_t *error, int error_count, int pict_type) | ||||||
| { | { | ||||||
|     uint8_t *side_data; |     uint8_t *side_data; | ||||||
|   | |||||||
| @@ -393,6 +393,11 @@ typedef struct AVPacket { | |||||||
| #endif | #endif | ||||||
| } AVPacket; | } AVPacket; | ||||||
|  |  | ||||||
|  | typedef struct AVPacketList { | ||||||
|  |     AVPacket pkt; | ||||||
|  |     struct AVPacketList *next; | ||||||
|  | } AVPacketList; | ||||||
|  |  | ||||||
| #define AV_PKT_FLAG_KEY     0x0001 ///< The packet contains a keyframe | #define AV_PKT_FLAG_KEY     0x0001 ///< The packet contains a keyframe | ||||||
| #define AV_PKT_FLAG_CORRUPT 0x0002 ///< The packet content is corrupted | #define AV_PKT_FLAG_CORRUPT 0x0002 ///< The packet content is corrupted | ||||||
| /** | /** | ||||||
|   | |||||||
| @@ -23,6 +23,48 @@ | |||||||
|  |  | ||||||
| #include "packet.h" | #include "packet.h" | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * Append an AVPacket to the list. | ||||||
|  |  * | ||||||
|  |  * @param head  List head element | ||||||
|  |  * @param tail  List tail element | ||||||
|  |  * @param pkt   The packet being appended. The data described in it will | ||||||
|  |  *              be made reference counted if it isn't already. | ||||||
|  |  * @param copy  A callback to copy the contents of the packet to the list. | ||||||
|  |                 May be null, in which case the packet's reference will be | ||||||
|  |                 moved to the list. | ||||||
|  |  * @return 0 on success, negative AVERROR value on failure. On failure, | ||||||
|  |            the packet and the list are unchanged. | ||||||
|  |  */ | ||||||
|  | int avpriv_packet_list_put(AVPacketList **head, AVPacketList **tail, | ||||||
|  |                            AVPacket *pkt, | ||||||
|  |                            int (*copy)(AVPacket *dst, const AVPacket *src), | ||||||
|  |                            int flags); | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * Remove the oldest AVPacket in the list and return it. | ||||||
|  |  * | ||||||
|  |  * @note The pkt will be overwritten completely on success. The caller | ||||||
|  |  *       owns the packet and must unref it by itself. | ||||||
|  |  * | ||||||
|  |  * @param head List head element | ||||||
|  |  * @param tail List tail element | ||||||
|  |  * @param pkt  Pointer to an AVPacket struct | ||||||
|  |  * @return 0 on success, and a packet is returned. AVERROR(EAGAIN) if | ||||||
|  |  *         the list was empty. | ||||||
|  |  */ | ||||||
|  | int avpriv_packet_list_get(AVPacketList **head, AVPacketList **tail, | ||||||
|  |                            AVPacket *pkt); | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * Wipe the list and unref all the packets in it. | ||||||
|  |  * | ||||||
|  |  * @param head List head element | ||||||
|  |  * @param tail List tail element | ||||||
|  |  */ | ||||||
|  | void avpriv_packet_list_free(AVPacketList **head, AVPacketList **tail); | ||||||
|  |  | ||||||
| int ff_side_data_set_encoder_stats(AVPacket *pkt, int quality, int64_t *error, int error_count, int pict_type); | int ff_side_data_set_encoder_stats(AVPacket *pkt, int quality, int64_t *error, int error_count, int pict_type); | ||||||
|  |  | ||||||
| int ff_side_data_set_prft(AVPacket *pkt, int64_t timestamp); | int ff_side_data_set_prft(AVPacket *pkt, int64_t timestamp); | ||||||
|   | |||||||
| @@ -23,6 +23,7 @@ | |||||||
|  |  | ||||||
| #include "libavutil/intfloat.h" | #include "libavutil/intfloat.h" | ||||||
| #include "libavutil/opt.h" | #include "libavutil/opt.h" | ||||||
|  | #include "libavcodec/packet_internal.h" | ||||||
| #include "avformat.h" | #include "avformat.h" | ||||||
| #include "internal.h" | #include "internal.h" | ||||||
| #include "aiff.h" | #include "aiff.h" | ||||||
| @@ -220,8 +221,8 @@ static int aiff_write_packet(AVFormatContext *s, AVPacket *pkt) | |||||||
|         if (s->streams[pkt->stream_index]->nb_frames >= 1) |         if (s->streams[pkt->stream_index]->nb_frames >= 1) | ||||||
|             return 0; |             return 0; | ||||||
|  |  | ||||||
|         return ff_packet_list_put(&aiff->pict_list, &aiff->pict_list_end, |         return avpriv_packet_list_put(&aiff->pict_list, &aiff->pict_list_end, | ||||||
|                                   pkt, FF_PACKETLIST_FLAG_REF_PACKET); |                                   pkt, av_packet_ref, 0); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     return 0; |     return 0; | ||||||
| @@ -272,7 +273,7 @@ static void aiff_deinit(AVFormatContext *s) | |||||||
| { | { | ||||||
|     AIFFOutputContext *aiff = s->priv_data; |     AIFFOutputContext *aiff = s->priv_data; | ||||||
|  |  | ||||||
|     ff_packet_list_free(&aiff->pict_list, &aiff->pict_list_end); |     avpriv_packet_list_free(&aiff->pict_list, &aiff->pict_list_end); | ||||||
| } | } | ||||||
|  |  | ||||||
| #define OFFSET(x) offsetof(AIFFOutputContext, x) | #define OFFSET(x) offsetof(AIFFOutputContext, x) | ||||||
|   | |||||||
| @@ -2007,12 +2007,6 @@ void av_format_inject_global_side_data(AVFormatContext *s); | |||||||
|  */ |  */ | ||||||
| enum AVDurationEstimationMethod av_fmt_ctx_get_duration_estimation_method(const AVFormatContext* ctx); | enum AVDurationEstimationMethod av_fmt_ctx_get_duration_estimation_method(const AVFormatContext* ctx); | ||||||
|  |  | ||||||
| typedef struct AVPacketList { |  | ||||||
|     AVPacket pkt; |  | ||||||
|     struct AVPacketList *next; |  | ||||||
| } AVPacketList; |  | ||||||
|  |  | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * @defgroup lavf_core Core functions |  * @defgroup lavf_core Core functions | ||||||
|  * @ingroup libavf |  * @ingroup libavf | ||||||
|   | |||||||
| @@ -23,6 +23,7 @@ | |||||||
| #include "libavutil/opt.h" | #include "libavutil/opt.h" | ||||||
| #include "libavutil/pixdesc.h" | #include "libavutil/pixdesc.h" | ||||||
| #include "libavcodec/flac.h" | #include "libavcodec/flac.h" | ||||||
|  | #include "libavcodec/packet_internal.h" | ||||||
| #include "avformat.h" | #include "avformat.h" | ||||||
| #include "avio_internal.h" | #include "avio_internal.h" | ||||||
| #include "flacenc.h" | #include "flacenc.h" | ||||||
| @@ -305,7 +306,7 @@ static int flac_queue_flush(AVFormatContext *s) | |||||||
|         write = 0; |         write = 0; | ||||||
|  |  | ||||||
|     while (c->queue) { |     while (c->queue) { | ||||||
|         ff_packet_list_get(&c->queue, &c->queue_end, &pkt); |         avpriv_packet_list_get(&c->queue, &c->queue_end, &pkt); | ||||||
|         if (write && (ret = flac_write_audio_packet(s, &pkt)) < 0) |         if (write && (ret = flac_write_audio_packet(s, &pkt)) < 0) | ||||||
|             write = 0; |             write = 0; | ||||||
|         av_packet_unref(&pkt); |         av_packet_unref(&pkt); | ||||||
| @@ -345,7 +346,7 @@ static void flac_deinit(struct AVFormatContext *s) | |||||||
| { | { | ||||||
|     FlacMuxerContext *c = s->priv_data; |     FlacMuxerContext *c = s->priv_data; | ||||||
|  |  | ||||||
|     ff_packet_list_free(&c->queue, &c->queue_end); |     avpriv_packet_list_free(&c->queue, &c->queue_end); | ||||||
| } | } | ||||||
|  |  | ||||||
| static int flac_write_packet(struct AVFormatContext *s, AVPacket *pkt) | static int flac_write_packet(struct AVFormatContext *s, AVPacket *pkt) | ||||||
| @@ -356,7 +357,7 @@ static int flac_write_packet(struct AVFormatContext *s, AVPacket *pkt) | |||||||
|     if (pkt->stream_index == c->audio_stream_idx) { |     if (pkt->stream_index == c->audio_stream_idx) { | ||||||
|         if (c->waiting_pics) { |         if (c->waiting_pics) { | ||||||
|             /* buffer audio packets until we get all the pictures */ |             /* buffer audio packets until we get all the pictures */ | ||||||
|             ret = ff_packet_list_put(&c->queue, &c->queue_end, pkt, FF_PACKETLIST_FLAG_REF_PACKET); |             ret = avpriv_packet_list_put(&c->queue, &c->queue_end, pkt, av_packet_ref, 0); | ||||||
|             if (ret < 0) { |             if (ret < 0) { | ||||||
|                 av_log(s, AV_LOG_ERROR, "Out of memory in packet queue; skipping attached pictures\n"); |                 av_log(s, AV_LOG_ERROR, "Out of memory in packet queue; skipping attached pictures\n"); | ||||||
|                 c->waiting_pics = 0; |                 c->waiting_pics = 0; | ||||||
|   | |||||||
| @@ -730,48 +730,6 @@ int ff_unlock_avformat(void); | |||||||
|  */ |  */ | ||||||
| void ff_format_set_url(AVFormatContext *s, char *url); | void ff_format_set_url(AVFormatContext *s, char *url); | ||||||
|  |  | ||||||
| #define FF_PACKETLIST_FLAG_REF_PACKET (1 << 0) /**< Create a new reference for the packet instead of |  | ||||||
|                                                     transferring the ownership of the existing one to the |  | ||||||
|                                                     list. */ |  | ||||||
|  |  | ||||||
| /** |  | ||||||
|  * Append an AVPacket to the list. |  | ||||||
|  * |  | ||||||
|  * @param head  List head element |  | ||||||
|  * @param tail  List tail element |  | ||||||
|  * @param pkt   The packet being appended. The data described in it will |  | ||||||
|  *              be made reference counted if it isn't already. |  | ||||||
|  * @param flags Any combination of FF_PACKETLIST_FLAG_* flags |  | ||||||
|  * @return 0 on success, negative AVERROR value on failure. On failure, |  | ||||||
|            the list is unchanged |  | ||||||
|  */ |  | ||||||
| int ff_packet_list_put(AVPacketList **head, AVPacketList **tail, |  | ||||||
|                        AVPacket *pkt, int flags); |  | ||||||
|  |  | ||||||
| /** |  | ||||||
|  * Remove the oldest AVPacket in the list and return it. |  | ||||||
|  * The behaviour is undefined if the packet list is empty. |  | ||||||
|  * |  | ||||||
|  * @note The pkt will be overwritten completely. The caller owns the |  | ||||||
|  *       packet and must unref it by itself. |  | ||||||
|  * |  | ||||||
|  * @param head List head element |  | ||||||
|  * @param tail List tail element |  | ||||||
|  * @param pkt  Pointer to an AVPacket struct |  | ||||||
|  * @return 0 on success. Success is guaranteed |  | ||||||
|  *         if the packet list is not empty. |  | ||||||
|  */ |  | ||||||
| int ff_packet_list_get(AVPacketList **head, AVPacketList **tail, |  | ||||||
|                        AVPacket *pkt); |  | ||||||
|  |  | ||||||
| /** |  | ||||||
|  * Wipe the list and unref all the packets in it. |  | ||||||
|  * |  | ||||||
|  * @param head List head element |  | ||||||
|  * @param tail List tail element |  | ||||||
|  */ |  | ||||||
| void ff_packet_list_free(AVPacketList **head, AVPacketList **tail); |  | ||||||
|  |  | ||||||
| void avpriv_register_devices(const AVOutputFormat * const o[], const AVInputFormat * const i[]); | void avpriv_register_devices(const AVOutputFormat * const o[], const AVInputFormat * const i[]); | ||||||
|  |  | ||||||
| #endif /* AVFORMAT_INTERNAL_H */ | #endif /* AVFORMAT_INTERNAL_H */ | ||||||
|   | |||||||
| @@ -48,6 +48,7 @@ | |||||||
| #include "libavcodec/bytestream.h" | #include "libavcodec/bytestream.h" | ||||||
| #include "libavcodec/flac.h" | #include "libavcodec/flac.h" | ||||||
| #include "libavcodec/mpeg4audio.h" | #include "libavcodec/mpeg4audio.h" | ||||||
|  | #include "libavcodec/packet_internal.h" | ||||||
|  |  | ||||||
| #include "avformat.h" | #include "avformat.h" | ||||||
| #include "avio_internal.h" | #include "avio_internal.h" | ||||||
| @@ -2991,7 +2992,7 @@ static int matroska_deliver_packet(MatroskaDemuxContext *matroska, | |||||||
|         MatroskaTrack *tracks = matroska->tracks.elem; |         MatroskaTrack *tracks = matroska->tracks.elem; | ||||||
|         MatroskaTrack *track; |         MatroskaTrack *track; | ||||||
|  |  | ||||||
|         ff_packet_list_get(&matroska->queue, &matroska->queue_end, pkt); |         avpriv_packet_list_get(&matroska->queue, &matroska->queue_end, pkt); | ||||||
|         track = &tracks[pkt->stream_index]; |         track = &tracks[pkt->stream_index]; | ||||||
|         if (track->has_palette) { |         if (track->has_palette) { | ||||||
|             uint8_t *pal = av_packet_new_side_data(pkt, AV_PKT_DATA_PALETTE, AVPALETTE_SIZE); |             uint8_t *pal = av_packet_new_side_data(pkt, AV_PKT_DATA_PALETTE, AVPALETTE_SIZE); | ||||||
| @@ -3013,7 +3014,7 @@ static int matroska_deliver_packet(MatroskaDemuxContext *matroska, | |||||||
|  */ |  */ | ||||||
| static void matroska_clear_queue(MatroskaDemuxContext *matroska) | static void matroska_clear_queue(MatroskaDemuxContext *matroska) | ||||||
| { | { | ||||||
|     ff_packet_list_free(&matroska->queue, &matroska->queue_end); |     avpriv_packet_list_free(&matroska->queue, &matroska->queue_end); | ||||||
| } | } | ||||||
|  |  | ||||||
| static int matroska_parse_laces(MatroskaDemuxContext *matroska, uint8_t **buf, | static int matroska_parse_laces(MatroskaDemuxContext *matroska, uint8_t **buf, | ||||||
| @@ -3179,7 +3180,7 @@ static int matroska_parse_rm_audio(MatroskaDemuxContext *matroska, | |||||||
|         track->audio.buf_timecode = AV_NOPTS_VALUE; |         track->audio.buf_timecode = AV_NOPTS_VALUE; | ||||||
|         pkt->pos                  = pos; |         pkt->pos                  = pos; | ||||||
|         pkt->stream_index         = st->index; |         pkt->stream_index         = st->index; | ||||||
|         ret = ff_packet_list_put(&matroska->queue, &matroska->queue_end, pkt, 0); |         ret = avpriv_packet_list_put(&matroska->queue, &matroska->queue_end, pkt, NULL, 0); | ||||||
|         if (ret < 0) { |         if (ret < 0) { | ||||||
|             av_packet_unref(pkt); |             av_packet_unref(pkt); | ||||||
|             return AVERROR(ENOMEM); |             return AVERROR(ENOMEM); | ||||||
| @@ -3401,7 +3402,7 @@ static int matroska_parse_webvtt(MatroskaDemuxContext *matroska, | |||||||
|     pkt->duration = duration; |     pkt->duration = duration; | ||||||
|     pkt->pos = pos; |     pkt->pos = pos; | ||||||
|  |  | ||||||
|     err = ff_packet_list_put(&matroska->queue, &matroska->queue_end, pkt, 0); |     err = avpriv_packet_list_put(&matroska->queue, &matroska->queue_end, pkt, NULL, 0); | ||||||
|     if (err < 0) { |     if (err < 0) { | ||||||
|         av_packet_unref(pkt); |         av_packet_unref(pkt); | ||||||
|         return AVERROR(ENOMEM); |         return AVERROR(ENOMEM); | ||||||
| @@ -3512,7 +3513,7 @@ FF_DISABLE_DEPRECATION_WARNINGS | |||||||
| FF_ENABLE_DEPRECATION_WARNINGS | FF_ENABLE_DEPRECATION_WARNINGS | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
|     res = ff_packet_list_put(&matroska->queue, &matroska->queue_end, pkt, 0); |     res = avpriv_packet_list_put(&matroska->queue, &matroska->queue_end, pkt, NULL, 0); | ||||||
|     if (res < 0) { |     if (res < 0) { | ||||||
|         av_packet_unref(pkt); |         av_packet_unref(pkt); | ||||||
|         return AVERROR(ENOMEM); |         return AVERROR(ENOMEM); | ||||||
|   | |||||||
| @@ -28,6 +28,7 @@ | |||||||
| #include "libavcodec/mpegaudio.h" | #include "libavcodec/mpegaudio.h" | ||||||
| #include "libavcodec/mpegaudiodata.h" | #include "libavcodec/mpegaudiodata.h" | ||||||
| #include "libavcodec/mpegaudiodecheader.h" | #include "libavcodec/mpegaudiodecheader.h" | ||||||
|  | #include "libavcodec/packet_internal.h" | ||||||
| #include "libavutil/intreadwrite.h" | #include "libavutil/intreadwrite.h" | ||||||
| #include "libavutil/opt.h" | #include "libavutil/opt.h" | ||||||
| #include "libavutil/dict.h" | #include "libavutil/dict.h" | ||||||
| @@ -387,7 +388,7 @@ static int mp3_queue_flush(AVFormatContext *s) | |||||||
|     mp3_write_xing(s); |     mp3_write_xing(s); | ||||||
|  |  | ||||||
|     while (mp3->queue) { |     while (mp3->queue) { | ||||||
|         ff_packet_list_get(&mp3->queue, &mp3->queue_end, &pkt); |         avpriv_packet_list_get(&mp3->queue, &mp3->queue_end, &pkt); | ||||||
|         if (write && (ret = mp3_write_audio_packet(s, &pkt)) < 0) |         if (write && (ret = mp3_write_audio_packet(s, &pkt)) < 0) | ||||||
|             write = 0; |             write = 0; | ||||||
|         av_packet_unref(&pkt); |         av_packet_unref(&pkt); | ||||||
| @@ -522,7 +523,7 @@ static int mp3_write_packet(AVFormatContext *s, AVPacket *pkt) | |||||||
|     if (pkt->stream_index == mp3->audio_stream_idx) { |     if (pkt->stream_index == mp3->audio_stream_idx) { | ||||||
|         if (mp3->pics_to_write) { |         if (mp3->pics_to_write) { | ||||||
|             /* buffer audio packets until we get all the pictures */ |             /* buffer audio packets until we get all the pictures */ | ||||||
|             int ret = ff_packet_list_put(&mp3->queue, &mp3->queue_end, pkt, FF_PACKETLIST_FLAG_REF_PACKET); |             int ret = avpriv_packet_list_put(&mp3->queue, &mp3->queue_end, pkt, av_packet_ref, 0); | ||||||
|  |  | ||||||
|             if (ret < 0) { |             if (ret < 0) { | ||||||
|                 av_log(s, AV_LOG_WARNING, "Not enough memory to buffer audio. Skipping picture streams\n"); |                 av_log(s, AV_LOG_WARNING, "Not enough memory to buffer audio. Skipping picture streams\n"); | ||||||
| @@ -630,7 +631,7 @@ static void mp3_deinit(struct AVFormatContext *s) | |||||||
| { | { | ||||||
|     MP3Context *mp3 = s->priv_data; |     MP3Context *mp3 = s->priv_data; | ||||||
|  |  | ||||||
|     ff_packet_list_free(&mp3->queue, &mp3->queue_end); |     avpriv_packet_list_free(&mp3->queue, &mp3->queue_end); | ||||||
|     av_freep(&mp3->xing_frame); |     av_freep(&mp3->xing_frame); | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -22,6 +22,7 @@ | |||||||
| #include "libavutil/crc.h" | #include "libavutil/crc.h" | ||||||
| #include "libavutil/intreadwrite.h" | #include "libavutil/intreadwrite.h" | ||||||
|  |  | ||||||
|  | #include "libavcodec/packet_internal.h" | ||||||
| #include "apetag.h" | #include "apetag.h" | ||||||
| #include "avformat.h" | #include "avformat.h" | ||||||
| #include "avio_internal.h" | #include "avio_internal.h" | ||||||
| @@ -93,8 +94,8 @@ static int tta_write_packet(AVFormatContext *s, AVPacket *pkt) | |||||||
|     TTAMuxContext *tta = s->priv_data; |     TTAMuxContext *tta = s->priv_data; | ||||||
|     int ret; |     int ret; | ||||||
|  |  | ||||||
|     ret = ff_packet_list_put(&tta->queue, &tta->queue_end, pkt, |     ret = avpriv_packet_list_put(&tta->queue, &tta->queue_end, pkt, | ||||||
|                              FF_PACKETLIST_FLAG_REF_PACKET); |                                  av_packet_ref, 0); | ||||||
|     if (ret < 0) { |     if (ret < 0) { | ||||||
|         return ret; |         return ret; | ||||||
|     } |     } | ||||||
| @@ -125,7 +126,7 @@ static void tta_queue_flush(AVFormatContext *s) | |||||||
|     AVPacket pkt; |     AVPacket pkt; | ||||||
|  |  | ||||||
|     while (tta->queue) { |     while (tta->queue) { | ||||||
|         ff_packet_list_get(&tta->queue, &tta->queue_end, &pkt); |         avpriv_packet_list_get(&tta->queue, &tta->queue_end, &pkt); | ||||||
|         avio_write(s->pb, pkt.data, pkt.size); |         avio_write(s->pb, pkt.data, pkt.size); | ||||||
|         av_packet_unref(&pkt); |         av_packet_unref(&pkt); | ||||||
|     } |     } | ||||||
| @@ -161,7 +162,7 @@ static void tta_deinit(AVFormatContext *s) | |||||||
|     TTAMuxContext *tta = s->priv_data; |     TTAMuxContext *tta = s->priv_data; | ||||||
|  |  | ||||||
|     ffio_free_dyn_buf(&tta->seek_table); |     ffio_free_dyn_buf(&tta->seek_table); | ||||||
|     ff_packet_list_free(&tta->queue, &tta->queue_end); |     avpriv_packet_list_free(&tta->queue, &tta->queue_end); | ||||||
| } | } | ||||||
|  |  | ||||||
| AVOutputFormat ff_tta_muxer = { | AVOutputFormat ff_tta_muxer = { | ||||||
|   | |||||||
| @@ -37,6 +37,7 @@ | |||||||
|  |  | ||||||
| #include "libavcodec/bytestream.h" | #include "libavcodec/bytestream.h" | ||||||
| #include "libavcodec/internal.h" | #include "libavcodec/internal.h" | ||||||
|  | #include "libavcodec/packet_internal.h" | ||||||
| #include "libavcodec/raw.h" | #include "libavcodec/raw.h" | ||||||
|  |  | ||||||
| #include "avformat.h" | #include "avformat.h" | ||||||
| @@ -438,40 +439,6 @@ static int init_input(AVFormatContext *s, const char *filename, | |||||||
|                                  s, 0, s->format_probesize); |                                  s, 0, s->format_probesize); | ||||||
| } | } | ||||||
|  |  | ||||||
| int ff_packet_list_put(AVPacketList **packet_buffer, |  | ||||||
|                        AVPacketList **plast_pktl, |  | ||||||
|                        AVPacket      *pkt, int flags) |  | ||||||
| { |  | ||||||
|     AVPacketList *pktl = av_mallocz(sizeof(AVPacketList)); |  | ||||||
|     int ret; |  | ||||||
|  |  | ||||||
|     if (!pktl) |  | ||||||
|         return AVERROR(ENOMEM); |  | ||||||
|  |  | ||||||
|     if (flags & FF_PACKETLIST_FLAG_REF_PACKET) { |  | ||||||
|         if ((ret = av_packet_ref(&pktl->pkt, pkt)) < 0) { |  | ||||||
|             av_free(pktl); |  | ||||||
|             return ret; |  | ||||||
|         } |  | ||||||
|     } else { |  | ||||||
|         ret = av_packet_make_refcounted(pkt); |  | ||||||
|         if (ret < 0) { |  | ||||||
|             av_free(pktl); |  | ||||||
|             return ret; |  | ||||||
|         } |  | ||||||
|         av_packet_move_ref(&pktl->pkt, pkt); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     if (*packet_buffer) |  | ||||||
|         (*plast_pktl)->next = pktl; |  | ||||||
|     else |  | ||||||
|         *packet_buffer = pktl; |  | ||||||
|  |  | ||||||
|     /* Add the packet in the buffered packet list. */ |  | ||||||
|     *plast_pktl = pktl; |  | ||||||
|     return 0; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| int avformat_queue_attached_pictures(AVFormatContext *s) | int avformat_queue_attached_pictures(AVFormatContext *s) | ||||||
| { | { | ||||||
|     int i, ret; |     int i, ret; | ||||||
| @@ -485,10 +452,10 @@ int avformat_queue_attached_pictures(AVFormatContext *s) | |||||||
|                 continue; |                 continue; | ||||||
|             } |             } | ||||||
|  |  | ||||||
|             ret = ff_packet_list_put(&s->internal->raw_packet_buffer, |             ret = avpriv_packet_list_put(&s->internal->raw_packet_buffer, | ||||||
|                                      &s->internal->raw_packet_buffer_end, |                                      &s->internal->raw_packet_buffer_end, | ||||||
|                                      &s->streams[i]->attached_pic, |                                      &s->streams[i]->attached_pic, | ||||||
|                                      FF_PACKETLIST_FLAG_REF_PACKET); |                                      av_packet_ref, 0); | ||||||
|             if (ret < 0) |             if (ret < 0) | ||||||
|                 return ret; |                 return ret; | ||||||
|         } |         } | ||||||
| @@ -841,7 +808,7 @@ int ff_read_packet(AVFormatContext *s, AVPacket *pkt) | |||||||
|                 if ((err = probe_codec(s, st, NULL)) < 0) |                 if ((err = probe_codec(s, st, NULL)) < 0) | ||||||
|                     return err; |                     return err; | ||||||
|             if (st->request_probe <= 0) { |             if (st->request_probe <= 0) { | ||||||
|                 ff_packet_list_get(&s->internal->raw_packet_buffer, |                 avpriv_packet_list_get(&s->internal->raw_packet_buffer, | ||||||
|                                    &s->internal->raw_packet_buffer_end, pkt); |                                    &s->internal->raw_packet_buffer_end, pkt); | ||||||
|                 s->internal->raw_packet_buffer_remaining_size += pkt->size; |                 s->internal->raw_packet_buffer_remaining_size += pkt->size; | ||||||
|                 return 0; |                 return 0; | ||||||
| @@ -914,9 +881,9 @@ int ff_read_packet(AVFormatContext *s, AVPacket *pkt) | |||||||
|         if (!pktl && st->request_probe <= 0) |         if (!pktl && st->request_probe <= 0) | ||||||
|             return ret; |             return ret; | ||||||
|  |  | ||||||
|         err = ff_packet_list_put(&s->internal->raw_packet_buffer, |         err = avpriv_packet_list_put(&s->internal->raw_packet_buffer, | ||||||
|                                  &s->internal->raw_packet_buffer_end, |                                  &s->internal->raw_packet_buffer_end, | ||||||
|                                  pkt, 0); |                                  pkt, NULL, 0); | ||||||
|         if (err < 0) { |         if (err < 0) { | ||||||
|             av_packet_unref(pkt); |             av_packet_unref(pkt); | ||||||
|             return err; |             return err; | ||||||
| @@ -1420,20 +1387,6 @@ FF_ENABLE_DEPRECATION_WARNINGS | |||||||
| #endif | #endif | ||||||
| } | } | ||||||
|  |  | ||||||
| void ff_packet_list_free(AVPacketList **pkt_buf, AVPacketList **pkt_buf_end) |  | ||||||
| { |  | ||||||
|     AVPacketList *tmp = *pkt_buf; |  | ||||||
|  |  | ||||||
|     while (tmp) { |  | ||||||
|         AVPacketList *pktl = tmp; |  | ||||||
|         tmp = pktl->next; |  | ||||||
|         av_packet_unref(&pktl->pkt); |  | ||||||
|         av_freep(&pktl); |  | ||||||
|     } |  | ||||||
|     *pkt_buf     = NULL; |  | ||||||
|     *pkt_buf_end = NULL; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * Parse a packet, add all split parts to parse_queue. |  * Parse a packet, add all split parts to parse_queue. | ||||||
|  * |  * | ||||||
| @@ -1530,9 +1483,9 @@ static int parse_packet(AVFormatContext *s, AVPacket *pkt, | |||||||
|  |  | ||||||
|         compute_pkt_fields(s, st, st->parser, &out_pkt, next_dts, next_pts); |         compute_pkt_fields(s, st, st->parser, &out_pkt, next_dts, next_pts); | ||||||
|  |  | ||||||
|         ret = ff_packet_list_put(&s->internal->parse_queue, |         ret = avpriv_packet_list_put(&s->internal->parse_queue, | ||||||
|                                  &s->internal->parse_queue_end, |                                  &s->internal->parse_queue_end, | ||||||
|                                  &out_pkt, 0); |                                  &out_pkt, NULL, 0); | ||||||
|         if (ret < 0) { |         if (ret < 0) { | ||||||
|             av_packet_unref(&out_pkt); |             av_packet_unref(&out_pkt); | ||||||
|             goto fail; |             goto fail; | ||||||
| @@ -1550,21 +1503,6 @@ fail: | |||||||
|     return ret; |     return ret; | ||||||
| } | } | ||||||
|  |  | ||||||
| int ff_packet_list_get(AVPacketList **pkt_buffer, |  | ||||||
|                        AVPacketList **pkt_buffer_end, |  | ||||||
|                        AVPacket      *pkt) |  | ||||||
| { |  | ||||||
|     AVPacketList *pktl; |  | ||||||
|     av_assert0(*pkt_buffer); |  | ||||||
|     pktl        = *pkt_buffer; |  | ||||||
|     *pkt        = pktl->pkt; |  | ||||||
|     *pkt_buffer = pktl->next; |  | ||||||
|     if (!pktl->next) |  | ||||||
|         *pkt_buffer_end = NULL; |  | ||||||
|     av_freep(&pktl); |  | ||||||
|     return 0; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| static int64_t ts_to_samples(AVStream *st, int64_t ts) | static int64_t ts_to_samples(AVStream *st, int64_t ts) | ||||||
| { | { | ||||||
|     return av_rescale(ts, st->time_base.num * st->codecpar->sample_rate, st->time_base.den); |     return av_rescale(ts, st->time_base.num * st->codecpar->sample_rate, st->time_base.den); | ||||||
| @@ -1695,7 +1633,7 @@ FF_ENABLE_DEPRECATION_WARNINGS | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     if (!got_packet && s->internal->parse_queue) |     if (!got_packet && s->internal->parse_queue) | ||||||
|         ret = ff_packet_list_get(&s->internal->parse_queue, &s->internal->parse_queue_end, pkt); |         ret = avpriv_packet_list_get(&s->internal->parse_queue, &s->internal->parse_queue_end, pkt); | ||||||
|  |  | ||||||
|     if (ret >= 0) { |     if (ret >= 0) { | ||||||
|         AVStream *st = s->streams[pkt->stream_index]; |         AVStream *st = s->streams[pkt->stream_index]; | ||||||
| @@ -1779,7 +1717,7 @@ int av_read_frame(AVFormatContext *s, AVPacket *pkt) | |||||||
|  |  | ||||||
|     if (!genpts) { |     if (!genpts) { | ||||||
|         ret = s->internal->packet_buffer |         ret = s->internal->packet_buffer | ||||||
|               ? ff_packet_list_get(&s->internal->packet_buffer, |               ? avpriv_packet_list_get(&s->internal->packet_buffer, | ||||||
|                                         &s->internal->packet_buffer_end, pkt) |                                         &s->internal->packet_buffer_end, pkt) | ||||||
|               : read_frame_internal(s, pkt); |               : read_frame_internal(s, pkt); | ||||||
|         if (ret < 0) |         if (ret < 0) | ||||||
| @@ -1828,7 +1766,7 @@ int av_read_frame(AVFormatContext *s, AVPacket *pkt) | |||||||
|             st = s->streams[next_pkt->stream_index]; |             st = s->streams[next_pkt->stream_index]; | ||||||
|             if (!(next_pkt->pts == AV_NOPTS_VALUE && st->discard < AVDISCARD_ALL && |             if (!(next_pkt->pts == AV_NOPTS_VALUE && st->discard < AVDISCARD_ALL && | ||||||
|                   next_pkt->dts != AV_NOPTS_VALUE && !eof)) { |                   next_pkt->dts != AV_NOPTS_VALUE && !eof)) { | ||||||
|                 ret = ff_packet_list_get(&s->internal->packet_buffer, |                 ret = avpriv_packet_list_get(&s->internal->packet_buffer, | ||||||
|                                                &s->internal->packet_buffer_end, pkt); |                                                &s->internal->packet_buffer_end, pkt); | ||||||
|                 goto return_packet; |                 goto return_packet; | ||||||
|             } |             } | ||||||
| @@ -1843,9 +1781,9 @@ int av_read_frame(AVFormatContext *s, AVPacket *pkt) | |||||||
|                 return ret; |                 return ret; | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         ret = ff_packet_list_put(&s->internal->packet_buffer, |         ret = avpriv_packet_list_put(&s->internal->packet_buffer, | ||||||
|                                  &s->internal->packet_buffer_end, |                                  &s->internal->packet_buffer_end, | ||||||
|                                  pkt, 0); |                                  pkt, NULL, 0); | ||||||
|         if (ret < 0) { |         if (ret < 0) { | ||||||
|             av_packet_unref(pkt); |             av_packet_unref(pkt); | ||||||
|             return ret; |             return ret; | ||||||
| @@ -1873,9 +1811,9 @@ static void flush_packet_queue(AVFormatContext *s) | |||||||
| { | { | ||||||
|     if (!s->internal) |     if (!s->internal) | ||||||
|         return; |         return; | ||||||
|     ff_packet_list_free(&s->internal->parse_queue,       &s->internal->parse_queue_end); |     avpriv_packet_list_free(&s->internal->parse_queue,       &s->internal->parse_queue_end); | ||||||
|     ff_packet_list_free(&s->internal->packet_buffer,     &s->internal->packet_buffer_end); |     avpriv_packet_list_free(&s->internal->packet_buffer,     &s->internal->packet_buffer_end); | ||||||
|     ff_packet_list_free(&s->internal->raw_packet_buffer, &s->internal->raw_packet_buffer_end); |     avpriv_packet_list_free(&s->internal->raw_packet_buffer, &s->internal->raw_packet_buffer_end); | ||||||
|  |  | ||||||
|     s->internal->raw_packet_buffer_remaining_size = RAW_PACKET_BUFFER_SIZE; |     s->internal->raw_packet_buffer_remaining_size = RAW_PACKET_BUFFER_SIZE; | ||||||
| } | } | ||||||
| @@ -3825,9 +3763,9 @@ FF_ENABLE_DEPRECATION_WARNINGS | |||||||
|         } |         } | ||||||
|  |  | ||||||
|         if (!(ic->flags & AVFMT_FLAG_NOBUFFER)) { |         if (!(ic->flags & AVFMT_FLAG_NOBUFFER)) { | ||||||
|             ret = ff_packet_list_put(&ic->internal->packet_buffer, |             ret = avpriv_packet_list_put(&ic->internal->packet_buffer, | ||||||
|                                      &ic->internal->packet_buffer_end, |                                      &ic->internal->packet_buffer_end, | ||||||
|                                      &pkt1, 0); |                                      &pkt1, NULL, 0); | ||||||
|             if (ret < 0) |             if (ret < 0) | ||||||
|                 goto unref_then_goto_end; |                 goto unref_then_goto_end; | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 James Almer
					James Almer