@@ -48,95 +48,110 @@ public bool ConfigureAndOpen(Action<DecoderContext> config, IDictionary<string,
4848
4949    public  void  Decode ( AvPacketWrapper  packet ,  ref  AvFrameWrapper  frame ) 
5050    { 
51-         int  decodeResult ; 
52- 
53-         // 尝试发送 
54-         logger . LogDebug ( "Try send packet to decoder." ) ; 
55- 
56-         var  sendResult  =  ctx . TrySendPacket ( packet ) ; 
57-         if  ( sendResult  ==  ffmpeg . AVERROR ( ffmpeg . EAGAIN ) ) 
58-         { 
59-             // reference: 
60-             // * tree/release/6.1/fftools/ffmpeg_dec.c:567 
61-             // 理论上不会出现 EAGAIN 
62- 
63-             logger . LogWarning ( 
64-                 "Receive {error} after sent, this could be cause by ffmpeg bug or some reason, ignored this message." , 
65-                 nameof ( ffmpeg . EAGAIN ) ) ; 
66-             sendResult  =  0 ; 
67-         } 
68- 
69-         if  ( sendResult  ==  0  ||  sendResult  ==  ffmpeg . AVERROR_EOF ) 
70-         { 
71-             // 发送成功 
72-             logger . LogDebug ( "PacketBuffer sent success, try get decoded frame." ) ; 
73-             // 获取解码结果 
74-             decodeResult  =  ctx . TryReceivedFrame ( ref  frame ) ; 
75-         } 
76-         else 
77-         { 
78-             var  error  =  new  ApplicationException ( FfMpegExtension . av_strerror ( sendResult ) ) ; 
79- 
80-             // 无法处理的发送失败 
81-             logger . LogError ( error ,  "Send packet to decoder failed.\n " ) ; 
82- 
83-             throw  error ; 
84-         } 
85- 
86-         if  ( decodeResult  <  0 ) 
51+         using  ( logger . BeginScope ( "{name}.{function}" , 
52+                    Context . ToString ( ) ,  nameof ( Decode ) ) ) 
8753        { 
88-             // 错误处理 
89-             ApplicationException  error ; 
90-             var  message  =  FfMpegExtension . av_strerror ( decodeResult ) ; 
54+             int  decodeResult ; 
55+             // 尝试发送 
9156
92-             if  ( decodeResult  ==  ffmpeg . AVERROR_EOF ) 
93-             { 
94-                 // reference: 
95-                 // * https://ffmpeg.org/doxygen/6.1/group__lavc__decoding.html#ga11e6542c4e66d3028668788a1a74217c 
96-                 // > the codec has been fully flushed, and there will be no more output frames 
97-                 // 理论上不会出现 EOF 
98-                 message  = 
99-                     "the codec has been fully flushed, and there will be no more output frames." ; 
57+             var  scope  =  logger . BeginScope ( packet . ToString ( ) ) ; 
10058
101-                  error   =   new ( message ) ; 
59+             logger . LogDebug ( "Try send packet to decoder." ) ; 
10260
103-                 logger . LogError ( error ,  "Received EOF from decoder.\n " ) ; 
104-             } 
105-             else  if  ( decodeResult  ==  ffmpeg . AVERROR ( ffmpeg . EAGAIN ) ) 
61+             var  sendResult  =  ctx . TrySendPacket ( packet ) ; 
62+             if  ( sendResult  ==  ffmpeg . AVERROR ( ffmpeg . EAGAIN ) ) 
10663            { 
10764                // reference: 
108-                 // * tree/release/6.1/fftools/ffmpeg_dec.c:596 
109-                 // * https://ffmpeg.org/doxygen/6.1/group__lavc__decoding.html#ga11e6542c4e66d3028668788a1a74217c 
110-                 // > output is not available in this state - user must try to send new input 
65+                 // * tree/release/6.1/fftools/ffmpeg_dec.c:567 
11166                // 理论上不会出现 EAGAIN 
112-                 message  = 
113-                     "output is not available in this state - user must try to send new input" ; 
11467
115-                 //if (_streamOption.KeyFrameOnly) 
116-                 //{ 
117-                 //    // 抛出异常,仅关键帧模式中,该错误不可能通过发送更多需要的包来解决 
118-                 //    error = new(message); 
68+                 logger . LogWarning ( 
69+                     "Receive {error} after sent, this could be cause by ffmpeg bug or some reason, ignored this message." , 
70+                     nameof ( ffmpeg . EAGAIN ) ) ; 
71+                 sendResult  =  0 ; 
72+             } 
11973
120-                 //    _logger.LogError(error, "Received EAGAIN from decoder.\n"); 
121-                 //    throw error; 
122-                 //} 
74+             if  ( sendResult  ==  0  ||  sendResult  ==  ffmpeg . AVERROR_EOF ) 
75+             { 
76+                 // 发送成功 
77+                 logger . LogDebug ( "PacketBuffer sent success, try get decoded frame." ) ; 
12378
124-                 // 忽略错误,发送下一个包进行编码,可能足够的包进入解码器可以解决 
125-                 logger . LogWarning ( "Receive EAGAIN from decoder, retry." ) ; 
126-                 // continue; 
79+                 scope ? . Dispose ( ) ; 
80+                 // 获取解码结果 
81+                 decodeResult  =  ctx . TryReceivedFrame ( ref  frame ) ; 
82+                 scope  =  logger . BeginScope ( frame . ToString ( ) ) ; 
12783            } 
12884            else 
12985            { 
130-                 error  =  new ( message ) ; 
131-                 logger . LogError ( error ,  "Uncaught error occured during decoding.\n " ) ; 
86+                 var  error  =  new  ApplicationException ( FfMpegExtension . av_strerror ( sendResult ) ) ; 
87+ 
88+                 // 无法处理的发送失败 
89+                 logger . LogError ( error ,  "Send packet to decoder failed.\n " ) ; 
90+ 
91+                 scope ? . Dispose ( ) ; 
13292                throw  error ; 
13393            } 
134-         } 
13594
136-         // 解码正常 
137-         logger . LogInformation ( "Decode frame success. type {type}, pts {pts}." , 
138-             frame . PictureType . ToString ( ) , 
139-             frame . GetPresentationTimeSpan ( ctx . TimeBase ) . ToString ( "c" ) ) ; 
95+             if  ( decodeResult  <  0 ) 
96+             { 
97+                 // 错误处理 
98+                 ApplicationException  error ; 
99+                 var  message  =  FfMpegExtension . av_strerror ( decodeResult ) ; 
100+ 
101+                 if  ( decodeResult  ==  ffmpeg . AVERROR_EOF ) 
102+                 { 
103+                     // reference: 
104+                     // * https://ffmpeg.org/doxygen/6.1/group__lavc__decoding.html#ga11e6542c4e66d3028668788a1a74217c 
105+                     // > the codec has been fully flushed, and there will be no more output frames 
106+                     // 理论上不会出现 EOF 
107+                     message  = 
108+                         "the codec has been fully flushed, and there will be no more output frames." ; 
109+ 
110+                     error  =  new ( message ) ; 
111+ 
112+                     logger . LogError ( error ,  "Received EOF from decoder.\n " ) ; 
113+                 } 
114+                 else  if  ( decodeResult  ==  ffmpeg . AVERROR ( ffmpeg . EAGAIN ) ) 
115+                 { 
116+                     // reference: 
117+                     // * tree/release/6.1/fftools/ffmpeg_dec.c:596 
118+                     // * https://ffmpeg.org/doxygen/6.1/group__lavc__decoding.html#ga11e6542c4e66d3028668788a1a74217c 
119+                     // > output is not available in this state - user must try to send new input 
120+                     // 理论上不会出现 EAGAIN 
121+                     message  = 
122+                         "output is not available in this state - user must try to send new input" ; 
123+ 
124+                     //if (_streamOption.KeyFrameOnly) 
125+                     //{ 
126+                     //    // 抛出异常,仅关键帧模式中,该错误不可能通过发送更多需要的包来解决 
127+                     //    error = new(message); 
128+ 
129+                     //    _logger.LogError(error, "Received EAGAIN from decoder.\n"); 
130+                     //    throw error; 
131+                     //} 
132+ 
133+                     // 忽略错误,发送下一个包进行编码,可能足够的包进入解码器可以解决 
134+                     logger . LogWarning ( "Receive EAGAIN from decoder, retry." ) ; 
135+                     // continue; 
136+                 } 
137+                 else 
138+                 { 
139+                     error  =  new ( message ) ; 
140+                     logger . LogError ( error ,  "Uncaught error occured during decoding.\n " ) ; 
141+                     
142+                     scope ? . Dispose ( ) ; 
143+                     
144+                     throw  error ; 
145+                 } 
146+             } 
147+ 
148+             // 解码正常 
149+             logger . LogInformation ( "Decode frame success. type {type}, pts {pts}." , 
150+                 frame . PictureType . ToString ( ) , 
151+                 frame . GetPresentationTimeSpan ( ctx . TimeBase ) . ToString ( "c" ) ) ; 
152+             
153+             scope ? . Dispose ( ) ; 
154+         } 
140155    } 
141156
142157    public  void  Dispose ( ) 
0 commit comments